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