当在本地,向服务器发送信息时,服务器接受信息返回给客户端,此时采用多行读取时,客户端接收不到Server的信息

java 复制代码
public class SocketTCP04Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket =new ServerSocket(9999);
        System.out.println("Server:"+serverSocket.getClass());
        System.out.println("正在等待用户连接...");

        //当有用户连接时,会返回一个socket对象
        Socket socket = serverSocket.accept();
        System.out.println("Client:"+serverSocket.getClass());//查看连接到的用户

        //接受Client的输入信息
        String read =null;
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
        while ((read= bufferedReader.readLine())!=null){
            System.out.println(read);
        }
//        String s = bufferedReader.readLine();
//        System.out.println(s);
//        socket.shutdownInput();

        //现在向Client发送数据
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter =new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("Hello, Client 字符流");
        bufferedWriter.newLine();//插入换行符,表示回复内容的结束
        bufferedWriter.flush();
        System.out.println("服务器已关闭~");

        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();

    }
}
java 复制代码
public class SocketTCP04Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("获取的Client的socket:" + socket.getClass());

        //现在向Server发送信息
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("Hello,server 字符流");
        bufferedWriter.newLine();
        /**插入换行符后,相当于写入结束,就不用socket.shutdownOutput();
        此时对面一定要使用readLine()一次读一行代表读取结束*/
        bufferedWriter.flush();

        //现在接受Server的信息
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String read = null;
        while ((read = bufferedReader.readLine()) != null) {
            System.out.println(read);
        }
//        String s = bufferedReader.readLine();
//        System.out.println(s);

        socket.shutdownInput();
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();

    }
}

此时的服务器还在等待输入,客户端也在等待服务器的应答,产生死锁,僵持不下。

经过一番尝试后发现,

当使用单行读取的时候,使用**bufferedWriter.newLine();此时就不用关闭socket的输出流,**即socket.shutdownOutput();可以省略,当然写上去也没错。

当使用多行读取的时候,此时,必须使用关闭socket的输出流,即socket.shutdownOutput();不能省略!!!

单行接受代码如下:

这是Client:

java 复制代码
 //现在向Server发送信息
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("Hello,server 字符流");
        bufferedWriter.newLine();
        /**插入换行符后,相当于写入结束,就不用socket.shutdownOutput();
        此时对面一定要使用readLine()一次读一行代表读取结束*/
        bufferedWriter.flush();
        socket.shutdownOutput();//可以省略,加上不为错

这是Server端:

java 复制代码
//接受Client的输入信息
        String read =null;
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);
        socket.shutdownInput();

多行读取时:

这是Client端:

java 复制代码
 //现在向Server发送信息
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("Hello,server 字符流");
        bufferedWriter.newLine();
        /**插入换行符后,相当于写入结束,就不用socket.shutdownOutput();
        此时对面一定要使用readLine()一次读一行代表读取结束*/
        bufferedWriter.flush();
        socket.shutdownOutput();//一定不能省略

这是Server端:

java 复制代码
       //接受Client的输入信息
        String read =null;
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
        while ((read= bufferedReader.readLine())!=null){
            System.out.println(read);
        }
        socket.shutdownInput();//不可省
相关推荐
怀旧,2 分钟前
【Linux系统编程】23. 线程同步与互斥(下)
linux·运维·服务器
西贝爱学习5 分钟前
pdf转TXT文本,适用于文字型PDF;扫描版PDF需要使用OCR(光学字符识别)技术来识别图中的文字
java·服务器·前端
偶尔上线经常挺尸6 分钟前
《每日一命令18:iptables——Linux防火墙入门》
linux·运维·服务器·iptables·防火墙
叮叮当当054312 分钟前
解决linux终端使用vim方向键失效问题
linux·运维·vim
原来是猿13 分钟前
网络计算器:理解序列化与反序列化(上)
linux·运维·服务器·网络·tcp/ip
Cx330❀19 分钟前
从零实现一个 C++ 轻量级日志系统:原理与实践
大数据·linux·运维·服务器·开发语言·c++·搜索引擎
Agent产品评测局19 分钟前
国产vs海外AI Agent方案,制造业场景适配性横评:企业级自动化选型全景深度解析
运维·人工智能·ai·chatgpt·自动化
程序leo源20 分钟前
Linux深度理解
linux·运维·服务器·c语言·c++·青少年编程·c#
Quinn2722 分钟前
正点原子 RK3562 Android14 Ubuntu 编译 SDK 环境准备:依赖、repo 与 Swap 配置一次搞定
linux·运维·ubuntu·mpu·正点原子·rk3562·arm linux
怀旧,26 分钟前
【Linux系统编程】22. 线程同步与互斥(上)
linux·运维·服务器