为了账号安全,请及时绑定邮箱和手机立即绑定

java.net.SocketException:软件导致连接中止:重新提交请求时出现套接字写入错误

java.net.SocketException:软件导致连接中止:重新提交请求时出现套接字写入错误

犯罪嫌疑人X 2021-09-29 17:26:24
使用套接字解决这个问题。我写了Http和TCP服务器的实现。HTTP 工作完全正确,因此我可以将请求一一发送到服务器。什么不能说 TCP 服务器,第一个请求离开并正确处理,但是当您尝试发送以下请求时,抛出此异常:java.net.SocketException: Software caused connection abort: socket write error    at java.net.SocketOutputStream.socketWrite0(Native Method)    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)    at java.net.SocketOutputStream.write(SocketOutputStream.java:134)    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:276)    at Main.main(Main.java:24)之后,客户端关闭,服务器端继续工作。HTTP和TCP是从同一个Server类实现的,启动服务器。我的服务器:public abstract class Server implements Runnable {    private final Socket clientSocket;    public Server(Socket clientSocket) {        this.clientSocket = clientSocket;    }    @Override    public void run() {        try (BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));             BufferedWriter output = new BufferedWriter(new PrintWriter(clientSocket.getOutputStream()))) {            String req = getRequest(reader);            setResponse(output, req);        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                clientSocket.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }启动服务器的类:public class RunServer extends Thread {    private final int port;    private ExecutorService executorService;    private String serverType;    private ServerFactoryContainer serverFactoryContainer;    public RunServer(String serverType, int port) {        this.port = port;        this.executorService = Executors.newFixedThreadPool(4);        this.serverType = serverType;        this.serverFactoryContainer = new ServerFactoryContainer();    }
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

您在客户端完成之前关闭客户端连接。在你的 Server 类中试试这个:


@Override

public void run()

{

  try (BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); BufferedWriter output = new BufferedWriter(new PrintWriter(clientSocket.getOutputStream())))

  {

    while (clientSocket.isConnected())

    {

      String req = getRequest(reader);

      setResponse(output, req);

    }

  }

  catch (IOException e)

  {

    e.printStackTrace();

  }

  finally

  {

    try

    {

      clientSocket.close();

    }

    catch (IOException e)

    {

      e.printStackTrace();

    }

  }

}


查看完整回答
反对 回复 2021-09-29
?
慕沐林林

TA贡献2016条经验 获得超9个赞

您的服务器在发送响应后似乎关闭了套接字。之后,客户端将无法在不打开新连接的情况下发送更多请求。通常,服务器允许客户端控制连接的命运,以便客户端可以发送多个请求。您的客户端可以发送“关闭”请求,以向服务器表明客户端打算关闭套接字并且不希望得到响应。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 327 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信