Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在什么时候提供免费端口?_Java_Android_Sockets_Asynchronous_Ports - Fatal编程技术网

Java Android在什么时候提供免费端口?

Java Android在什么时候提供免费端口?,java,android,sockets,asynchronous,ports,Java,Android,Sockets,Asynchronous,Ports,我有一个子活动,它创建一个异步任务,打开一个Java ServerSocket并在该serverPort上调用accept() 现在,在这个活动的onStop()方法中,我调用cancel()来取消异步任务。在我的异步类中,在onPostExecute()和onCancelled()方法中,我关闭serverSocket(以及可能已打开的任何其他数据流或套接字) 我所有的代码都正常运行。通过调试,我知道如果我: 线性运行应用程序,直到serverSocket开始接受()连接为止 点击后退按钮,关

我有一个子活动,它创建一个异步任务,打开一个Java ServerSocket并在该serverPort上调用accept()

现在,在这个活动的onStop()方法中,我调用cancel()来取消异步任务。在我的异步类中,在onPostExecute()和onCancelled()方法中,我关闭serverSocket(以及可能已打开的任何其他数据流或套接字)

我所有的代码都正常运行。通过调试,我知道如果我:

  • 线性运行应用程序,直到serverSocket开始接受()连接为止
  • 点击后退按钮,关闭子活动并调用其onStop()方法,该方法随后取消相关异步任务并在serverSocket上调用close()
  • 再次运行子活动,创建新的异步线程,代码运行到我在第一个端口上创建serverSocket的位置。但是,它抛出一个IO异常,并表示该端口已在使用中
  • 无论我等待多长时间,重新启动此子活动都会引发IO异常,声称端口已被占用。然而,做一些事情,比如:

    重新启动设备

    重新安装应用程序

    完全关闭应用程序(而不是从父活动重新启动子活动)

  • 似乎把港口解放了

    Android如何刷新/释放您使用的端口? 有没有办法通过编程方式调用这些端口的刷新

    在明显的问题出现之前,我正在使用P2P和java套接字,所以是的,我确实希望在静态本地端口上使用到套接字的直接连接和直接接受等等

    编辑:格式化

    编辑2:换衣服后

    serverSocket = new ServerSocket(portNumber);
    socket = serverSocket.accept();
    
    致:

    我现在收到一个java.net.BindException:bind失败:eaddnotavil(无法分配请求的地址)异常。(这只发生在第一组条件之后。应用程序的第一次运行仍然像以前一样正常运行)


    编辑3:如果我能找到一个正确的方法,我会在编辑中发布它,但现在(调试)我只想走一条又快又脏的路线,每当用户按下后退按钮并重新启动应用程序到主活动时,就完全杀死应用程序。这似乎会清除端口绑定。

    几分钟后,仍然在网络中的请求不会在同一个四元组(源ip、源端口、目标ip、目标端口)上发送信息。这是所有操作系统(在Windows、Linux、*BSD等系统中)中TCP套接字的一个常见功能。您可以通过在套接字上指定SO_REUSEADDR选项来关闭该端口,该选项将告诉操作系统在关闭端口后不要保留该端口


    这里有一个很好的解释说明了SO_REUSEADDR的用途:

    我在serverSocket上调用了serverSocket.setReuseAddress(false)。但是,该端口仍在使用中,并且我仍然从已在使用的端口获取IOException。您希望使用true调用它。显然,您必须在套接字的第一个和第二个版本上执行此操作。不重用是默认设置。到目前为止,我还没有让它与serverSocket.setReuseAddress(true)或serverSocket.setReuseAddress(false)一起使用。是否需要在serverSocket=newserversocket(portNumber)之前调用它,或者我可以在之后调用它?您需要在绑定套接字之前调用它。因此,不要使用接受端口号的构造函数。使用无参数构造函数,调用它,然后调用socket.bind(地址,端口)。应该注意的是,“几分钟后”适用于通过Accept套接字连接的任何端口。侦听端口本身立即被释放。如果没有连接,也不会有“几分钟后”。代码片段会很有帮助。什么是“异步任务”-异步任务?您确定要关闭套接字吗?之后accept()会发生什么情况?
    serverSocket = new ServerSocket();
    serverSocket.setReuseAddress(true);
    serverSocket.bind(new InetSocketAddress("192.168.49.1", 8000));
    socket = serverSocket.accept();