【问题标题】:EADDRINUSE When creating server socket on google glassEADDRINUSE 在谷歌玻璃上创建服务器套接字时
【发布时间】:2014-10-09 08:41:25
【问题描述】:

我正在开发一个 google glass/android 应用程序。它是一个视频流应用程序,具有服务器/客户端设置,其中手机/眼镜是服务器,并将 PC 与会话描述挂钩以播放视频。它在 android 上运行良好,一切运行良好,但是一旦我尝试在 google glass 上测试它,它就会在这一行抛出一个错误

sSocket = new ServerSocket(sPort);

异常消息显示“EADDRINUSE”,我假设这意味着端口已经打开,但我从未打开它。即使我打开了它并且我的程序没有关闭它,我更改了几次端口,它仍然说它正在使用中。

谢谢

【问题讨论】:

  • 需要更多代码才能(可能)提供帮助。
  • 我没有包含更多代码的唯一原因是因为它是基本的 tcp 服务器/客户端代码。根据 Android 规范,ServerSocket 声明位于单独的线程中。 run 方法只有一个带有 new ServiceHandler(sSocket.accept())).start(); 的循环。这增加了一个新的套接字连接。 ServiceHandler 中的 run 方法只是做我需要对那个套接字做的 io。我尝试将 soReuseAddress 设置为 true,然后在此之后绑定它,但不是 EADDRINUSE,而是在 serversocket accept() 循环中得到大量异常。

标签: android sockets google-glass google-gdk


【解决方案1】:

泰勒,

Google Glass 与 android 一样,其许多端口始终会被后台运行的应用程序占用。在为服务器创建要侦听的套接字时,您有两种选择:

1) 有一个预先确定的端口列表,您可以选择让您的服务器监听。

如果您选择这样做,那么您可以简单地拥有一个包含所有端口的数据结构(列表、队列、堆[如果您对想要使用的端口有一定的优先级]等),那么您可以简单地遍历它们,直到找到一个开放的端口。

这可以通过以下方式实现:

private ServerSocket allocatePort(List<Integer> myArray) throws IOException {
    for (int individualPort : myArray) {
        try {
            return new ServerSocket(individualPort);
        } catch (IOException io) {
            continue; // An exception will be thrown if this port is currently in use. It's OK, let's try another port.
        }
    }

    // When no ports are available, let's throw an exception stating we were unable to find an open port.
    throw new IOException("we were unable to find an open port");
}

然后只需在您的内部调用此方法,如下所示:

int[] arrayOfPorts = {5000, 5001, 5002, 8000, 8001, 8002, 8003};
List<Integer> myArray = new ArrayList<>();
myArray = IntStream.of(arrayOfPorts).boxed().collect(Collectors.toList());
ServerSocket sSocket = allocatePort(myArray);

2) 如果您不介意监听哪个端口,您可以使用构造函数选择任何可用端口。

这可以通过以下方式实现:

  ServerSocket sSocket = new ServerSocket(0);

您可以在 ServerSocket 的Javadocs 上阅读更多信息。注意参数的小节:

  port - the port number, or 0 to use a port number that is automatically allocated.

如果您有任何问题,请告诉我!

【讨论】:

  • 谢谢!!!!!!!!!我尝试了三个不同的端口,并且都收到了开放端口错误,所以我认为它们都被阻止了。当我使用操作系统指定端口并记录它时,它工作得很好。我唯一的问题是如何将该端口传送到我的 PC 端应用程序?我需要端口来设置我的套接字连接。我是否应该在 android 端放一个端口列表并循环遍历它,直到我得到一个可以工作的端口,然后在客户端有相同的列表,我正在循环通过,直到一个端口工作并从服务器获得正确的响应?
  • 嘿泰勒,我很高兴一切都为你解决了!! :0) 哈哈;你明白了,你应该在客户端有相同的端口列表并循环通过它们,就像你描述的那样。希望您有一个非常好的一周,如果您有任何其他问题,请告诉我!感谢您的时间! :-)
猜你喜欢
  • 2021-01-23
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多