![](/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.