0

我在 Windows7 上的 Android AVD 中使用以下 Java 代码来创建我的服务器,其中 serverPort = 1131;

            try {
                    ServerSocket serverSocket = new ServerSocket(serverPort);

                    serverSocket.setReuseAddress(true);

                    while(isRunning){
                            try {
                                    final Socket socket = serverSocket.accept();

                                    DefaultHttpServerConnection serverConnection = new DefaultHttpServerConnection();

                                    serverConnection.bind(socket, new BasicHttpParams());

                                    httpService.handleRequest(serverConnection, httpContext);

                                    serverConnection.shutdown();
                            } catch (IOException e) {
                                    e.printStackTrace();
                            } catch (HttpException e) {
                                    e.printStackTrace();
                            }
                    }

                    serverSocket.close();
            } 
            catch (IOException e) {
                    e.printStackTrace();
            }
    }

我得到以下异常:-

    01-18 06:30:03.381: W/System.err(1494): java.net.BindException: bind failed: EACCES (Permission denied)

我机器上的防火墙已关闭,我也为此添加了特殊规则。我需要为在 Window7 上的 AVD 上运行服务器做一些特别的事情吗?

请帮忙。

谢谢

4

1 回答 1

2

我在 MSDN 网站上找到了以下内容(在网站上搜索“bind”和“EACCES”):

WSAEACCES - 10013

没有权限。

试图以访问权限禁止的方式访问套接字。一个示例是在没有使用 setsockopt(SO_BROADCAST) 设置广播权限的情况下使用广播地址进行 sendto。

WSAEACCES 错误的另一个可能原因是当调用绑定函数时(在带有 SP4 的 Windows NT 4.0 和更高版本上),另一个应用程序、服务或内核模式驱动程序被绑定到具有独占访问权限的同一地址。这种独占访问是带有 SP4 及更高版本的 Windows NT 4.0 的新功能,并通过使用 SO_EXCLUSIVEADDRUSE 选项实现。

因此,如果我们假设 JVM 本地库映射WSAEACCES到此异常,则有两种明显的可能解释:

  • 这是基于权限的事情。ADV 无权绑定到该端口。

  • 其他一些应用程序已经使用 SO_EXCLUSIVEADDRUSE 套接字选项绑定到端口。

IMO,任何一种解释都是合理的。(或者它可能是别的东西......)

于 2012-01-18T14:56:25.817 回答