会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132904个问题

客户端不显示

package com.bjsxt.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/** 
 * <p>Title: TcpServerScoket01</p>  
 * <p>Description: 使用TCP Socket实现单向通信(服务器端)</p>  
 * @author xiaoding
 * @date Jul 29, 2020  
 * @version 1.0 
 */
public class TcpServerScoket01 {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器启动");
        //创建服务器对象
        ServerSocket my = new ServerSocket(9999);
        //使用accept方法监听,服务器端口
        Socket p = my.accept();
        //接受客户端发送的数据
        InputStream fis = p.getInputStream();
        //定义一个中转站
        byte[] buf = new byte[1024];
        int len = 0;    //获取读取的次数
        //将读取的数据打印出来
        while((len = fis.read(buf)) != -1) {
            System.out.println(new String(buf,0,len));
        }
//        System.out.println((char)fis.read());
        
        //发送消息
        OutputStream fos = p.getOutputStream();
        //写入数据
        fos.write("收到了".getBytes());
        //关闭IO流
        if (fos != null) {
            fos.close();
        }
        if (fis != null) {
            fis.close();
        }
    }
}

package com.bjsxt.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays;

/** 
 * <p>Title: TestTcpSocket01</p>  
 * <p>Description: 使用Tcp Scoket单向通信(客户端)</p>  
 * @author xiaoding
 * @date Jul 29, 2020  
 * @version 1.0 
 */
public class TestTcpSocket01 {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //创建Socket对象
        Socket my = new Socket("127.0.0.1",9999);
        //发送消息
        OutputStream fis = my.getOutputStream();
        fis.write("你好".getBytes());
        
        //接受消息
        InputStream fos = my.getInputStream();
                
        //定义一个中转站
        byte[] buf = new byte[1024];
        int len = 0;    //获取字符
        while((len = fos.read(buf)) != -1) {
            System.out.println(new String(buf,0,len));
        }
        //关闭IO
        if (fos != null) {
            fos.close();
        }
        if (fis != null) {
            fis.close();
        }
        
        if (my != null) {
            my.close();
        }
    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 30631楼
Python 全系列/第十三阶段:高并发性能怪兽-Tornado 框架/Tornado 异步(旧) 30632楼

看完了这节课的视频以后,总结了下面的内容:

这节课的视频与上次课的视频不同的点在

上次课最后实现的多线程是 多个客户端访问一个服务器的情况,为了让服务器处理多个客户端,使用循环开启多个线程,为每一个客户端开启一个线程来处理服务器端接收信息及相应信息的操作。

while(true){

      Socket socket=server.accept();//接受多个客户端的连接

      ServerThread st=new ServerThread(socket);

      new Thread(st).start();

}


这次课的多线程是客户端的多线程,是单个客户端和单个服务器端之间,单个客户端想跟单个服务器端多次聊天,如果是单次聊天,按视频里最开始的写法(没有多线程的),客户端就只能先,通过BufferedReader包装键盘录入发送信息,后获取响应,并且只有一次聊天的机会,socket就结束了。

为了解决这两个问题:

1)客户端想多次聊天

2)客户端能不能不要总是先发送,后接受信息,能主动接受信息吗?

解决:

1) 循环,循环发送信息,循环读取信息,就可以多次聊天了

2)怎么能决定先发送还是先接受,如果写成以前死的代码,就是先发送后接受,想先接受怎么办,多线程,建立一个发送线程,一个接受线程,让2个线程开启,cpu不断的切换2个线程,有内容发送到客户端来,就主动去接受,就可以先接受了。这边键盘录入,用户想发送的时候按下回车,就可以向输入流中写数据,创造输入的字符串,有内容想发送到服务端,就会触发发送线程。


我分析的视频中的代码:

image.png


一个客户端 一个服务端

服务端只接受一次的socket对象,后面的多次聊天都是因为 

客户端一直开启线程,等待用户键盘录入的回车,从而发送数据,

服务器端接收到数据就一直执行while(true),不停的readUTF() 和writeUTF("收到了");


至于我看到有同学问为什么服务器端能一直读取,我想是因为while(true)里面的readUTF()在不停执行,只要在流里读到东西就会读取出来,在流里东西可用,检测到流末尾或者抛出异常前,此方法一直阻塞,等待读取的字符串。这里需要老师验证一下我说的,是不是我分析的这个原因******。


还有一个问题******,就是在客户端线程类:Send类的send方法中写出字符串的时候,为什么要flush一下。

我猜是因为:这里也需要老师解答一下:

1)每次写出之后flush是为了提高效率,如果一直不flush,缓冲区如果满了就会造成缓冲区堵塞

2)视频里的案例没有关闭流,关闭流的操作里会刷新,但是没有关闭流,一直开着,所以在这里刷新一下。

ps:

什么时候字节流需要刷新:

如果你的流入数据不是特别多,可以都操作结束了关流时写入,那么如果你的数据特别多,你把他们全都放到流中就会占用内存吧,如果占用够多就会死机吧?然后结果你明白了!你读取数据失败了!或者説你担心万一死机了数据没有保存不是很坑!所以你可以选择什么时候刷新下

所以当传入的数据特别大,又担心什么时候会突然停止的时候,字节流可以在某些地方刷新一下。

image.png


以上提到的两个地方都需要老师解答一下(带******号的),还有提到的其他地方如果有不太对的地方,也希望老师指导一下,谢谢!

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 30637楼
JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 30638楼
JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 30639楼

1.png

运行的结果A:和B:后面的为什么会一样?A:后面不应该是__main__.A吗

Python 全系列/第一阶段:Python入门/面向对象 30641楼
Python 全系列/第一阶段:Python入门/序列 30644楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 30645楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637