![](/img/trans.png)
[英]MultiThreaded Socket Server Java, connection reset SocketException
[英]SocketException: Connection Reset when trying to read from socket in 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套接字过去一直对我有用,为什么现在这样呢?
接收方正在等待发送方永远不会发送的行尾。 在发送端尝试类似println()
东西。
你的代码对我来说非常好......你忘记了添加
writer.close();
socket.close();
你的作家?
你需要结合尼克和尼古拉所说的内容:你需要用println编写(因为readLine期待行尾)你需要在关闭之前刷新你的编写器。
Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("Test.jpg");
writer.flush();
我建议在你尝试阅读之前刷新你的作家,在你尝试阅读它之前,有可能永远不会发送数据。
克里斯是对的。 当你正在使用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();
这是因为您的服务器退出了。 使用while循环发送。 看到这个 。 这里发生的事情是在客户端检索数据之前,服务器程序退出,以便重置连接,并在客户端抛出您看到的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.