【问题标题】:Server Socket not listening on correct ip address [closed]服务器套接字未侦听正确的 IP 地址 [关闭]
【发布时间】:2013-04-28 05:36:02
【问题描述】:

我用 C# 编写了一个服务器套接字活动和一个客户端。但我的 C# 客户端从不与 android 服务器连接。 在搜索时我发现了这个问题。 java.net.ServerSocket.accept() doesn't return on Android

我的服务器套接字正在侦听 ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=5000]) 而不是 10.0.2.15。请指导我正确的方向。

    private String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()
                        && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) { return inetAddress.getHostAddress().toString(); }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return null;
}

 public class ServerThread implements Runnable {

        public void run() {
            try {
                if (SERVERIP != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Listening on IP: " + SERVERIP);
                        }
                    });
                    serverSocket = new ServerSocket(SERVERPORT);
                    while (true) {
                        // LISTEN FOR INCOMING CLIENTS
                        Socket client = serverSocket.accept();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Connected.");
                            }
                        });

                        try {
                            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                            String line = null;
                            while ((line = in.readLine()) != null) {
                                Log.d("ServerActivity", line);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {

                                    }
                                });
                            }
                            break;
                        } catch (Exception e) {
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                                }
                            });
                            e.printStackTrace();
                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Couldn't detect internet connection.");
                        }
                    });
                }
            } catch (Exception e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Error");
                    }
                });
                e.printStackTrace();
            }
        }
    }

【问题讨论】:

    标签: java android sockets serversocket


    【解决方案1】:

    移动设备作为服务器工作的可能性取决于您的移动互联网提供商的防火墙配置。通常这是禁用的。只有当设备通过无线而不是移动宽带连接时,这种类型的连接才能起作用。

    0.0.0.0 在任何情况下都是无效地址。尝试获取主机地址时忽略它。

    【讨论】:

    • 我想在我的模拟器上测试这个应用程序!有没有办法完成这项工作?
    • 0.0.0.0 不是“无效地址”。
    • 用于指定指定无效、未知或不适用的目标,不可路由。
    【解决方案2】:

    ServerSocket 没有监听正确的 IP 地址

    是的。 ServerSocket 返回 0.0.0.0 作为其本地地址没有任何问题。那是 INADDR_ANY。这只是意味着它将接受通过任何本地接口的连接。这不是你的问题。

    【讨论】:

    • 但是当我尝试在 C# 客户端中使用 IPAddress.Any 时!它仍然无法正常工作
    • 您已经在使用它了。这就是你看到 0.0.0.0 的原因。这是默认设置。您没有通过明确指定来更改任何内容。这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2011-05-19
    • 2020-10-16
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多