Android免费端口在什么时候?

时间:2015-04-18 19:06:43

标签: java android sockets asynchronous ports

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

现在,在这个Activity的onStop()方法中,我调用了cancel()我的异步任务。在我的异步类中,在onPostExecute()和onCancelled()方法中,我关闭了serverSocket(以及可能已经打开的任何其他dataStreams或Sockets)。

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

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

    重启设备

    重新安装应用程序

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

  5. 似乎可以释放端口。

    Android如何刷新/释放您使用过的端口? 有没有什么方法可以用编程方式在这些端口上调用刷新?

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

    编辑:格式化

    EDIT2:更改后

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

    要:

    serverSocket = new ServerSocket();
    serverSocket.setReuseAddress(true);
    serverSocket.bind(new InetSocketAddress("192.168.49.1", 8000));
    socket = serverSocket.accept();
    

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

    编辑3:如果我找到了正确执行此操作的方法,我会将其发布到编辑中,但是现在(调试)我只是想快速而肮脏的路线并完全每当用户按下后退按钮并将应用程序重新启动到主活动时,都会终止应用程序。这似乎清除了端口绑定。

1 个答案:

答案 0 :(得分:2)

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

以下是对SO_REUSEADDR的详细解释:What is the meaning of SO_REUSEADDR (setsockopt option) - Linux?