0

我有点难过,可能是因为我不知道如何正确搜索(我尝试了许多不同的关键字)。无论如何,我正在尝试 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)
4

3 回答 3

0

我认为你的socket = new Socket(serverAddr, TARGETPORT);投掷IOException。因为您使用的 IP 地址无效。否则,此代码应该可以正常工作。

于 2014-07-01T05:36:10.973 回答
0

您将IOException尝试侦听刚刚检索到的本地端口:

 bind failed: EADDRINUSE (Address already in use)

在我看来应该是这样的:

 port already in use

为什么那个端口没有被释放我不知道。有没有解绑的可能?

于 2014-07-01T10:20:44.783 回答
-1

我相信我已经解决了我自己的问题,这要归功于 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();
}
于 2014-07-01T20:27:55.040 回答