簡體   English   中英

SocketException:嘗試從Java中讀取套接字時連接重置?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM