当在本地,向服务器发送信息时,服务器接受信息返回给客户端,此时采用多行读取时,客户端接收不到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();//不可省
相关推荐
YCY^v^1 小时前
centos 7 开启80,443端口,怎么弄?
linux·运维·centos
北南京海1 小时前
[Linux]进程地址空间
linux·运维·服务器
yzx9910132 小时前
服务器生成图片
运维·服务器
liulilittle4 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
小阳睡不醒6 小时前
小白成长之路-部署Zabbix7(二)
android·运维
杰克逊的日记7 小时前
GPU运维常见问题处理
linux·运维·gpu
caolib7 小时前
无需云服务器的内网穿透方案 -- cloudflare tunnel
运维·服务器·内网穿透·tunnel·cloudflared
奇舞精选7 小时前
k8s基本概念初探
运维
誰能久伴不乏8 小时前
Linux系统调用概述与实现:深入浅出的解析
linux·运维·服务器
程序员学习随笔8 小时前
Linux进程深度解析(2):fork/exec写时拷贝性能优化与exit资源回收机制(进程创建和销毁)
linux·运维·服务器