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