5

我成功地用 C# 制作了一个客户端服务器程序,在 LAN 下完美运行,我们使用了 TcpListener 和 TcpSocket 类。

虽然我们无法让它通过互联网工作,但我知道它与防火墙、路由器端口阻塞等有关。

我们转发了我们使用的端口并关闭了我们的防火墙,但仍然没有运气。

为了完成这项工作,我必须做些什么不同的事情?像使用某个端口一样可以正常工作吗?说“Msn Messenger”是如何做到的?

服务器代码:

  private static TcpListener serverTcpListener;

   public static bool Run()
    {
        // Initialize new thread for client communications
        Thread listenThread = new Thread(new ThreadStart(ListenForClients));
        
        // Initialize TCP listener and attempt to start
        ServerTcpListener = new TcpListener(IPAddress.Any, 3000);

        try
        {
            ServerTcpListener.Start();
        }
        catch (SocketException)
        {
            return false;
        }


        // Start client communications thread
        listenThread.Start();

        return true;
    }





    
    public static void ListenForClients()
    {
        while (true)
        {
            TcpClient client = ServerTcpListener.AcceptTcpClient();
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

客户代码:

    private TcpClient myClient;
    private NetworkStream clientStream;

   public InitializeResult Initialize()
    {
        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

        try
        {
            MyClient.Connect(serverEndPoint);
        }
        catch (SocketException)
        {
            return InitializeResult.AccessError;
        }
        catch (ArgumentNullException)
        {
            return InitializeResult.NullRemote;
        }

        try
        {
            ClientStream = MyClient.GetStream();
        }
        catch (Exception)
        {
            return InitializeResult.StreamFail;
        }

        if (!Authenticate())
        {
            return InitializeResult.AuthenticateFail;
        }


        return InitializeResult.Success;
        
    }
4

4 回答 4

2

如果这:

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

正是您的客户端代码中的内容,这可能就是问题所在,即使防火墙设置正确。您必须修改客户端程序以将 IP 作为配置设置、命令行参数、文本框等,然后改用它。

如果可能的话,我会首先使用运行服务器的盒子的地址在同一 LAN 上的两台计算机上进行测试。如果无法连接,请确保 IP 正确(通过在运行服务器的机器上运行 ipconfig),并查看服务器上是否打开了 Windows 防火墙。如果是,你要么必须允许你的程序,要么只打开 3000 端口。

一旦确认工作正常,完全来自另一个网络,使用服务器所在网络的外部 IP。您可以通过访问http://icanhazip.com/或类似网站来获取此信息(我更喜欢这个而不是 whatismyip,没有广告,它只提供 IP 地址),并确保防火墙/路由器上的端口 3000 设置为转发到服务器盒子的内部IP。

于 2012-10-03T01:12:15.357 回答
2

以下是您可能会遇到的一些常见问题:

服务器

  1. Windows 防火墙。
  2. 路由器上的端口转发。
    • http://portforward.com/是一个很好的资源,我相信您可以选择您的路由器,它会为您提供相应的步骤。您需要选择托管服务器的机器的 LAN IP 地址,以及您尝试连接的端口(在您的情况下为 3000)。

客户

对于客户端,它应该可以正常连接,但您必须指定外部 IP 地址,而不是服务器的 LAN IP 地址。您可以通过在托管服务器的计算机上访问 http://whatismyip.com找到它。

--

Msn 和类似的聊天程序使用像这样简单的客户端/服务器方法 - 很容易完成。不过,一个非常有趣的聊天程序是 Skype。它使用 P2P 系统,而不是客户端-服务器。它使用 Nat Hole Punching 来完成,如果您有兴趣(作为学生)我建议您研究它以扩展您的网络知识。

于 2012-10-03T00:58:04.367 回答
0

您需要绑定到外部网卡。您有可能绑定到 Loopback 适配器

如果您提供一些代码,我们也许可以诊断(甚至修复)问题

于 2012-10-03T00:46:19.957 回答
-1

您需要在以下位置替换127.0.0.1为您的实际 IP 地址:

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);

要获取您的 IP,您可以谷歌“我的 ip 是什么”或从服务器访问www.whatismyip.com/ 。

我还建议在您的客户端和服务器上安装Wireshark 。在调试套接字和其他网络问题时,我经常使用这个工具。

于 2012-10-03T01:15:11.183 回答