Android服务可能重用?

时间:2016-08-08 12:30:55

标签: android multithreading sockets service android-service

我正在做一个项目,其中2人通过wifi-hotspot连接(一个作为热点,另一个通过wifi连接到它),他们可以交换消息(我将在以后制作文件)。

我使用两个服务创建套接字连接(内部有两个线程,一个用于发送信息,另一个用于读取信息),一个用于服务器,另一个用于客户端。通信应该是双向的,并且可以由它们中的任何一个启动,这是我遇到问题的地方。

基本上在开始时,我启动服务并启动线程接收(我设置一个动作并在方法onStartCommand上检查它,以了解要创建的线程)。然后一个人有一个按钮,如果他们按下它,他们就可以发送消息。如果一个人发送消息,我将再次启动该服务(并将操作设置为SEND,以便我可以启动线程发送消息)。

问题是,如果我再次启动服务(发送),我将获得已经在使用的套接字的例外(已经尝试过执行setReuseAddress(true)并且它不起作用)。我对流有类似的问题,它们不会“相关”(来自一方的输出流不是来自另一方的输入流的相应输出 - 它们每次创建时都会交换标题)。

你们怎么认为我可以解决这个问题?我可以将流和套接字设置为静态,并检查它们是否已经创建,但这似乎不太一致。如果你们需要,我可以发布代码,但它会有点长

1 个答案:

答案 0 :(得分:0)

只需检查套接字是否正在使用并关闭它

private boolean isPortInUse(String host, int port) {
  // Assume no connection is possible.
  boolean result = false;

  try {
    (new Socket(host, port)).close();
    result = true;
  }
  catch(SocketException e) {
    // Could not connect.
  }

  return result;
}