当在本地,向服务器发送信息时,服务器接受信息返回给客户端,此时采用多行读取时,客户端接收不到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();//不可省
相关推荐
探索宇宙真理.3 小时前
Nginx UI MCP接口绕过认证漏洞 | CVE-2026-33032复现&研究
运维·经验分享·网络安全·nginx-ui
llm大模型算法工程师weng3 小时前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
byoass3 小时前
企业云盘私有化部署:存储架构设计与安全运维全流程实战
运维·网络·安全·云计算
fTiN CAPA3 小时前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
love530love4 小时前
修复 ComfyUI 插件 ComfyUI-BiRefNet-ZHO 报错 - Windows
服务器·人工智能·windows·python·birefnet-zho
无忧.芙桃4 小时前
进程控制之进程等待
linux·运维·服务器
云栖梦泽4 小时前
Linux内核与驱动:13.从设备树到Platform平台总线
linux·运维·c++·嵌入式硬件
Agent产品评测局4 小时前
企业流程异常处理自动化落地,预警处置全流程实现方案:2026企业“数字免疫系统”构建指南
运维·人工智能·ai·chatgpt·自动化
charlie1145141914 小时前
嵌入式Linux驱动开发指南02——内核空间基础与硬件访问
linux·运维·c语言·驱动开发·嵌入式硬件
不会写DN5 小时前
TCP 长连接服务:登录注册认证体系实战指南
服务器·网络·网络协议·tcp/ip·计算机网络·面试