[英]TCP Socket write error
這個簡單的 Java TCP 服務器/客戶端示例有什么問題?
首先,啟動服務器:
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Throwable {
ServerSocket ss = new ServerSocket(2345);
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
Thread.sleep(5000);
for (int i = 0; i < 3; i++) {
os.write("A".getBytes());
os.flush();
System.out.println("Written in cycle " + i);
}
os.close();
s.close();
}
}
之后啟動客戶端並觀察服務器:
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Throwable{
Socket s=new Socket("localhost",2345);
s.close();
System.out.println("Closed");
}
}
客戶端套接字立即關閉。 但是,服務器上的套接字寫入操作在第二個循環中失敗,即第一次寫入沒有拋出異常。
這是服務器的執行output:
Written in cycle 0
Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:124)
at Server.main(Server.java:16)
您的客戶端連接並立即關閉。 這被拒絕寫入“無處”的服務器檢測到。
以下鏈接與問題 100% 匹配,並解釋了問題是什么以及如何解決它:
http://download.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html
因此,更具體地與上述代碼相關,將 LINGER 設置為 0 將解決問題:
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Throwable {
Socket s = new Socket("localhost", 2345);
s.setSoLinger(true, 0);
s.close();
}
}
當您寫入套接字時,它必須將該數據傳遞給遠程系統。 如果要等待遠程系統等待確認每條數據,它會慢很多倍。 無論如何,這不是 TCP 的工作方式。
如果您需要遠程套接字來確認它已收到您的數據,您需要添加您自己的協議以確保您發送的每條數據都已收到。
從評論中復制,因為它回答了您的問題。
客戶端套接字是否必須做一些事情來接收來自服務器的輸出流? 也許我只是遺漏了一些東西,所以如果我錯了請糾正我,但是為什么在創建客戶端套接字后立即關閉它? 這就是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.