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

使用套接字解决这个问题。我写了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();

    }


犯罪嫌疑人X
浏览 338回答 2
2回答

qq_花开花谢_0

您在客户端完成之前关闭客户端连接。在你的 Server 类中试试这个:@Overridepublic 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();    }  }}

慕沐林林

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

相关分类

Java