繁体   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