簡體   English   中英

Java(Android):在用於另一個套接字的LocalPort上創建ServerSocket

[英]Java(Android): create ServerSocket on LocalPort used for another Socket

我有些困惑,可能是因為我不知道如何正確搜索(我嘗試了許多不同的關鍵字)。 無論如何,我正在嘗試TCP穿孔的一種變體(使用會合服務器)。 我已經為服務器創建了一個TCP套接字,並在不引發任何異常的情況下將其關閉。 但是,當我嘗試在原始套接字的本地端口上創建ServerSocket時,它將失敗,並出現IOException。

private static int LOCALPORT = 0;
private static String TARGETIP = "88.888.88.888";
private static int TARGETPORT = 8888;
try{
    InetAddress serverAddr = InetAddress.getByName(TARGETIP);
    socket = new Socket(serverAddr, TARGETPORT);
    LOCALPORT = socket.getLocalPort();
    socket.close();
    ServerSocket sSocket = new ServerSocket(LOCALPORT);
    Socket skt = sSocket.accept();
}
catch (IOException e){
}

我只是無法繞開為什么不能關閉插槽並在同一端口上打開服務器插槽的問題。

更新:從logcat

java.net.BindException: bind failed: EADDRINUSE (Address already in use)
Caused by: libcore.io.ErrnoException: bind failed: EADDRINUSE (Address already in use)

我認為您的socket = new Socket(serverAddr, TARGETPORT); 拋出IOException 因為您使用的IP地址無效。 否則,此代碼應該可以正常工作。

您將得到一個IOException嘗試在剛剛檢索的本地端口上進行偵聽:

 bind failed: EADDRINUSE (Address already in use)

我認為應該這樣:

 port already in use

我不知道為什么不釋放該端口。 可以取消綁定嗎?

我相信,借助greenapps和一些其他在線搜索,我已經解決了自己的問題。 您需要將其設置為可重用,而不是關閉原始套接字! 太簡單了,哇。

private static int LOCALPORT = 0;
private static String TARGETIP = "88.888.88.888";
private static int TARGETPORT = 8888;
try{
    InetAddress serverAddr = InetAddress.getByName(TARGETIP);
    socket = new Socket(serverAddr, TARGETPORT);
    LOCALPORT = socket.getLocalPort();
    //socket.close();
    socket.setReuseAddress(true);
    ServerSocket sSocket = new ServerSocket(LOCALPORT);
    Socket skt = sSocket.accept();
    sSocket.close();
}
catch (IOException e){
    e.getMessage();
    e.printStackTrace();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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