SocketException:尝试从Java中读取套接字时连接重置?

在使用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:连接重置当我运行它? 这是完整的堆栈跟踪:

 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套接字过去一直对我有用,为什么现在这样呢?

你需要结合Nick和Nikolai所说的内容:你需要用println编写(因为readLine期望行结束)并且你需要在关闭之前刷新你的编写器。

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

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

你的代码对我来说非常好……你忘了添加

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

你的作家?

我建议你在尝试阅读前刷新你的作家,在你尝试阅读之前,有可能永远不会发送数据。

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

克里斯是对的。 当您正在使用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();