java.net.SocketException: Connection reset,解决办法

来源:3-4 完善用户登陆之服务器响应客户端

杨勤_cd

2018-09-25 15:04

看评论很多都说了这个问题,但是我的情况完全不一样(写得和他们的代码一样还是会报错)

https://img.mukewang.com/5ba9dad600011a1a07360341.jpg

经过调试发现,需要修改两个地方:

1.当服务器响应客户端时,需要在响应信息输完后加入 socket.shutdownOutput(),代表这个响应内容已经输完了,这时才会发送给客户端读取这个响应

2.这样调试下来运行不再报错,但是直接运行依然报错,这是因为客户端还没有来得及读取,服务器相关关闭代码就已经开始运行了,从而报错,所以需要在关闭前加个等待时间。

我的代码如下:

服务端:

package com.socket.socketsender.socketTest;

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

public class Server {

    public static void main(String[] args)  {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("=======服务器已启动,开始监听=========");
            Socket accept = serverSocket.accept();
            InputStream inputStream = accept.getInputStream();
            InputStreamReader isr = new InputStreamReader(inputStream);
            BufferedReader br = new BufferedReader(isr);
            String str = null;
            while ((str = br.readLine()) != null) {
                System.out.println("我是服务器,从客户端收到消息:" + str);
            }
            accept.shutdownInput();
            //响应给客户端
            OutputStream outputStream = accept.getOutputStream();
            PrintWriter pw = new PrintWriter(outputStream);
            pw.write("你很帅气啊");
            pw.flush();
           accept.shutdownOutput();//如果不加这个,客户端一直收不到响应,直到服务端关闭了,客户端就报错了。
            try {
                //如果不设置等待时间,服务端已经关闭了,客户端还没有来得及读取这个响应,从而报错
                System.out.println("先不要关闭");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            pw.close();//开始关闭相关资源,如果前面不加shutdownOutput/等待时间,则从此处开始报错
            outputStream.close();
            br.close();
            isr.close();
            inputStream.close();
            accept.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


客户端:

package com.socket.socketsender.socketTest;

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

public class Client {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8888);
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter ps = new PrintWriter(outputStream);
            ps.write("用户名:小羊,职位:测试工程师");
            ps.flush();

            socket.shutdownOutput();

            InputStream inputStream = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String str = null;

            while ((str = br.readLine()) != null) {
                System.out.println("服务器给出的响应是:" + str);
            }

            br.close();
            inputStream.close();
            ps.close();
            outputStream.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


虽然这样能解决问题,但是感觉还是很low,有没有什么更加好的办法,

可以保证客户端读到响应后服务端才关闭?

或者就让服务端一直开启?---我试过把服务端所有资源关闭语句注释掉,但客户端每发送一次数据,服务端还是会关闭

写回答 关注

1回答

  • 不改bug
    2018-10-19 13:51:20
    已采纳
    try {
                    //如果不设置等待时间,服务端已经关闭了,客户端还没有来得及读取这个响应,从而报错
                    System.out.println("先不要关闭");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

    我将你的代码中这个去掉,客户端是可以接收到服务端信息的.

    qq_慕沐1...

    如果传输的内容多一点的话还是会报连接重置的错。

    2019-05-22 17:14:04

    共 1 条回复 >

Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125006 学习 · 596 问题

查看课程

相似问题