java网络编程Socket output is already shutdown

news/2024/6/17 8:44:06 标签: java, 网络, 开发语言

java网络编程中使用TCP协议在Client端和Server端循环收发消息时,如果用的是BufferedReader和BufferedWriter,出现Client端只能发送一次消息,当发送第二次消息时,Server端已经关闭的情况,具体报错为:Socket output is already shutdown或者是由于以前的关闭调用,套接字在那个方向已经关闭,发送或接收数据的请求没有被接受
解决方案为Client端发送完消息后不要写 socket.shutdownOutput();,直接bw.write(line); bw.newLine(); bw.flush();就行,写正确的代码实例如下:


import java.io.*;
import java.net.Socket;
import java.util.Scanner;
//Client端
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        Scanner sc = new Scanner(System.in);
        String line;
        while(true){
            System.out.println("请输入要发送的内容:");
            line = sc.nextLine();
            bw.write(line);
            bw.newLine();
            bw.flush();
            //后面不要加  socket.shutdownOutput();
            line = br.readLine();
            System.out.println(line);
        }


    }
}


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10086);

        Socket socket = ss.accept();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        String line;
        while(true){
            line = br.readLine();
            System.out.println(line);

            //回写数据
            bw.write("数据收到了");
            bw.newLine();
            bw.flush();
            //这里也不用写
          
        }
    }
}

按照上面的形式写代码,就可以循环发送数据了


http://www.niftyadmin.cn/n/5190210.html

相关文章

EnlightenGAN 开源代码运行问题汇总

参考链接: EnlightenGAN 开源代码运行EnlightenGAN的运行环境搭建和训练自己的数据 源码下载和环境配置比较简单,本文测试环境:Win10 RTX3060、cuda 11.3、python 3.8 torch 1.12.0 numpy 1.20.1 如果想修改在项目里创建test_daatset文…

德迅云安全带您了解什么是僵尸网络攻击 103.36.165.X 103.36.166.X 103.36.167.X

僵尸网络是指采用一种或多种传播手段,将大量主机感染僵尸程序病毒,从而在控制者和被感染主机之间所形成的一个可一对多控制的网络。 攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机将通过一个控制信道接收攻击者的指令…

git commit 后 发现提交信息写错了怎么办

解决方案: 可以使用 git commit --amend 命令。此命令将打开默认文本编辑器,允许你编辑最近的提交的提交信息。 以下是使用 git commit --amend 的步骤: 首先,在你的工作目录中进行所需的更改。运行 git add 命令将更改的文件添…

springboot+vue+element简单实现教学课程申报管理系统

目录 一、项目预览 二、项目效果图及说明 1.项目说明 1.登录 2.欢迎页 3.教师管理 4.课程申报 ​5.管理员管理 三、代码实现 1.后端项目结构图 2.数据库表脚本 3.路由配置 四、总结 一、项目预览 在线预览:点击访问其他项目访问:点击访问后端实…

成功解决:文档根元素 “mapper“ 必须匹配 DOCTYPE 根 “null“

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 文章目录 前言错误信息解决方法 前言 错误…

Linux驱动开发 问题随笔

1、内核空间与用户空间数据交换方式 分两种情况: 1> 需要交换的数据量较大时; 2> 需要交换的数据量较小时; 第一种情况使用以下的函数: unsigned long copy_to_user(void __user* to, const void* from, unsigned long n)…

Google Play上架马甲包攻略

想要更好的海外推广离开google play应用市场,有了谷歌就可以按各平台规则来进行推广,做广告投放基本都离不开谷歌市场的包,所以有了马甲包。然而,Google Play对于马甲包的上传有一系列限制和规定。以下是一些Google Play上架马甲包…

低代码,让我效率提升了80%

目录 ​编辑 一、前言 二、优势 三、主要功能点 四、低代码归根结底差不多 五、小结 一、前言 低代码开发平台,一个号称能在几分钟的时间里开发出一套公司内部都可使用的应用系统开发工具。很多人或许都隐隐听说过低代码,因为低代码不仅远名国外&#xf…