我正在使用C#TcpListener和TcpClient编写客户端服务器应用程序。这是我现在所拥有的:
//Server
class Listener
{
List<Client> clients; //list of clients
TcpListener listener;
//client accepting method
async void Listen()
{
while (Listening)
{
Client client = new Client(await listener.AcceptTcpClientAsync());
clients.Add(client).
client.Exchange(); //wait for client's messages
}
//...
}
}
class Client //client handling class
{
TcpClient conn;
public Client(TcpClient conn)
{
this.conn = conn;
}
}
和一个简单的客户端代码,该代码仅连接到服务器,等待来自服务器的消息并在单击按钮时发送消息,服务器将广播该消息给所有其他用户。现在,我希望能够在两个客户端之间建立直接连接(用于私人消息传递和其他功能)。
我知道TcpClient中有一个Socket属性,而Socket中有Local / RemoteEndPoint属性,因此服务器已经具有有关这两个客户端主机的一些信息。我什至尝试用另一个客户端RemoteEndPoint创建一个Socket,但是显然,这不起作用,因为服务器正在使用端口。可以通过服务器通知两个客户端所需的信息(客户端类允许分别与客户端一起玩),但是如何为两个客户端静默建立TCP连接(即没有防火墙消息),即使是隐藏在防火墙和NAT-下的普通客户端也是如此。路由器?