【发布时间】:2014-08-21 13:52:17
【问题描述】:
我有点难过,可能是因为我不知道如何正确搜索(我尝试了许多不同的关键字)。无论如何,我正在尝试 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)
【问题讨论】:
-
因什么 IOException 而失败?
-
请告诉我如何找出给出的 IOException,我很乐意在这里提供。我不是一个很有经验的程序员。我只知道上面的 catch 执行了,因此它是一个 IOException。
-
在 catch 块中添加一个打印
e.getMessage()的日志行。还要加一行e.printStackTrace();然后在logcat里看一下,发到这里。
标签: java android sockets tcp hole-punching