簡體   English   中英

TCP 套接字寫入錯誤

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

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