嘿,伙计们我成功地在C#中使用C#完美地运行客户端服务器程序,我们使用了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;
}
答案 0 :(得分:2)
以下是您可能遇到的一些常见问题:
对于客户端,它应该能够正常连接,但您必须指定外部IP地址,而不是服务器的LAN IP地址。您可以通过访问托管服务器的计算机上的http://whatismyip.com找到它。
-
Msn和类似的聊天程序使用这样简单的客户端/服务器方法 - 非常容易实现。尽管如此,一个非常有趣的聊天程序是Skype。它使用P2P系统,而不是客户端服务器。它使用Nat Hole Punching完成它,如果你感兴趣(作为一名学生),我建议你去研究它以扩展你的网络知识。
答案 1 :(得分:2)
如果:
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
正是您的客户端代码中的内容,即使防火墙设置正确,也可能是问题所在。您必须修改客户端程序以将IP作为配置设置,命令行参数,文本框等,然后使用它。
我首先使用运行服务器的盒子的地址,在同一局域网上使用两台计算机进行测试。如果无法连接,请确保IP正确(通过在运行服务器的计算机上运行ipconfig),并查看服务器上是否启用了Windows防火墙。如果是,您将要么允许您的程序,要么只打开端口3000。
一旦确认工作,完全从另一个网络,使用网络的外部IP服务器开启。你可以通过转到http://icanhazip.com/或类似的方式来获得这个(我更喜欢这个,而不是广告,它只回送IP地址),并确保防火墙/路由器上的端口3000被设置为转发到内部服务器盒的IP。
答案 2 :(得分:0)
您需要绑定到外部NIC。有可能绑定到Loopback适配器
如果您提供一些代码,我们可能会诊断(甚至修复)
答案 3 :(得分:-1)
您需要将127.0.0.1
替换为您的实际IP地址:
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
要获取您的IP,您可以使用Google“我的IP是什么”或从服务器转到www.whatismyip.com/。
我还建议在客户端和服务器上安装Wireshark。我在调试套接字和其他网络问题时经常使用这个工具。