【问题标题】:SocketException: Connection Reset when trying to read from socket in Java?SocketException:尝试从 Java 中的套接字读取时连接重置?
【发布时间】:2011-11-22 14:24:52
【问题描述】:

在使用 Java 套接字时遇到了一些恼人的问题,我的应用程序似乎在非常基本的层面上失败了。我的应用程序的一部分需要通过 TCP 连接编写文件名。接收端代码如下:

ServerSocket serverSocket = new ServerSocket(4445); 
Socket socket = serverSocket.accept();      
BufferedReader reader = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
String filename = reader.readLine();

而我的发件人代码如下:

    Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
    PrintWriter writer = new PrintWriter(socket.getOutputStream());
    writer.write("Test.jpg");

这里有非常非常基本的东西,但由于某种原因,我得到一个 SocketException: Connection Reset 当我运行它时?这是完整的堆栈跟踪:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at FileReceiver.main(FileReceiver.java:11)

FileReceiver.java:11 行是进行reader.readLine() 调用的行。我这辈子都不知道出了什么问题,过去 TCP 套接字的类似基本使用一直对我有用,为什么现在会发生这种情况?

【问题讨论】:

    标签: java sockets tcp


    【解决方案1】:

    你的代码对我来说工作得很好......你忘记添加了吗

        writer.close();
        socket.close();
    

    给你的作家?

    【讨论】:

      【解决方案2】:

      接收方正在等待您的发送方永远不会发送的行尾。在发送端尝试println() 之类的东西。

      【讨论】:

        【解决方案3】:

        您需要结合 Nick 和 Nikolai 所说的话: 您需要使用 println 写入(因为 readLine 需要行尾),并且您需要在关闭之前刷新您的写入器。

         Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
         PrintWriter writer = new PrintWriter(socket.getOutputStream());
         writer.println("Test.jpg");
         writer.flush();
        

        【讨论】:

        • writer.close(); 不刷新流吗?
        • 确实如此,我假设它被打开以供其他写作。
        • 我使用了 flush() 但什么也没发生,请帮忙
        【解决方案4】:

        我建议在您尝试阅读之前刷新您的写入器,在您尝试阅读之前可能永远不会发送数据。

        【讨论】:

          【解决方案5】:

          这是因为您的服务器退出了。使用 while 循环发送。见this。这里发生的是在客户端检索数据之前,服务器程序退出以便重置连接并且您看到的异常在客户端抛出。

          【讨论】:

            【解决方案6】:

            克里斯是对的。当您使用 PrintWriter 或什至像 ObjectOutputStream (ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());) 这样的 序列化 时,您需要调用 .flush() 函数,之后您必须关闭 Writer 和套接字。您的解决方案如下:

             Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
             PrintWriter writer = new PrintWriter(socket.getOutputStream());
             writer.println("Test.jpg");
             writer.flush();
             writer.close();
             socket.close();
            

            下面是序列化的示例:(通过网络发送一个对象或将其保存到原始状态的文件中以供将来复制)

                ...
            ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(record);
            oos.flush();
            oos.close();
            socket.close();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-08-07
              • 2011-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-07
              相关资源
              最近更新 更多