智能手机和计算机之间的套接字连接不起作用

Socket connection won't work between smartphone and computer

我有一个使用 TCPListener 在我的计算机中启动服务器的 C# WPF 应用程序,以及一个用作客户端的 android 应用程序。当我启动服务器并在我的计算机中模拟该应用程序时,它工作得很好,但大多数时候当我使用我的智能手机连接到我的计算机时它不起作用,它只在我重新启动路由器 DHCP 和我的智能手机。

需要的话,这里是连接码

服务器:

private static IPAddress ipAd;
private static TcpListener server;
private static TcpClient client;

public static void start() {
    //Already tried with both
    ipAd = IPAddress.Parse(TCPServer.GetLocalIPAddress());
    //ipAd = IPAddress.Parse("127.0.0.1"); 

    server = new TcpListener(ipAd, 1209);
    client = default(TcpClient);
    try {
         server.Start();
        Console.WriteLine("Server started");
    } catch {
        Console.WriteLine("Failed to start server");
    }

客户:

Socket socket = null;
String response = new String();
try{
    //connect This ipAddress is the same in my desktop
    InetAddress ipAd = InetAddress.getByName(ipAddress);
    socket = new Socket(ipAd, 1209);
    //send
    DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
    DOS.write(message.getBytes());
}
...

感谢您抽出宝贵时间,我应该更专注于我的计算机网络 class...

我应该重定向某个特定端口吗?在我的router/firewall中有一些特定的配置吗?我想我错过了什么

当您的设备在 IP 路由方面位于同一网络时,这将起作用。然而,即使是最简单的 SOHO 级 WiFi routers/AP 的一部分也启用了所谓的设备隔离,拒绝从 wifi 设备访问它们之间的网络访问或通过以太网连接的客户端。

要使此设置可靠地工作,您需要确保以下几点:

  1. 在移动应用程序中使用路由器的外部地址。 (你可以从服务器浏览http://whatismyip.org发现它)

  2. 在路由器中设置端口转发,将特定端口转发到内部网络中的特定 IP。

至于私有源代码,您宁愿在服务器应用程序中使用 0.0.0.0 作为绑定地址,因为默认的 .NET 实现将 select 第一个可用的 IP 地址,它可能不是您使用的那个在移动应用程序中用于连接或与同一网络无关。在复杂的网络设置的情况下,这种方法可能存在安全性和便利性(共存)问题,但适用于大多数情况。