Java(Android):在LocalPort上创建用于另一个Socket的ServerSocket

时间:2014-07-01 05:16:01

标签: java android sockets tcp hole-punching

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

我无法解决为什么我无法关闭套接字并在同一端口上打开serversocket。

更新:来自logcat

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您将获得IOException试图收听刚刚检索到的本地端口:

 bind failed: EADDRINUSE (Address already in use)

这应该在我看来:

 port already in use

为什么不发布该端口我不知道。是否有可能解除它?

答案 2 :(得分:-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();
}