2016-10-05 126 views
0

我有一个正在工作的客户端/服务器多线程程序。 我的问题是,我怎么能选择任何客户端,并从服务器发送他的数据包?[C#] Socket编程,客户端接口

+0

如果您的程序通过TCP套接字连接,那么您将为每个客户端存储一个套接字。将消息发送到相关的套接字。 – LordWilmore

+0

是的,我使用TCP套接字。但是我总是为新客户端创建一个新的Socket。另外我需要一个“列表”,但哪个? – ExclusivAtom

+0

是的,你为每个客户端创建一个新的套接字,所以如果你想发送一条消息给一个客户端,然后通过你为该客户端存储的套接字发送它。如果您不知道哪个套接字是针对哪个客户端的,但您需要将其发送给特定的客户端,那么您需要从每个客户端发送足够的信息以允许服务器确定哪个客户端是哪个客户端。但这完全在你自己的控制之下。 – LordWilmore

回答

1

我最常做的,是建立一个Client类,它包含一个Socket,当有一个新的传入连接,我创建了一个新的客户端,并给了他当前的服务器实例(this),并定义了客户端套接字。

Client类:

public class Client 
{ 
    public int Id; 
    public Socket socket; 
    public Server serverInstance; 

    public Client(Server server, Socket sock) 
    { 
     this.Id = GenerateNewUniqueId(); // Generates a unique id (you must implement it :p) 
     this.serverInstance = server; 
     this.socket = sock; 
    } 
} 

服务器接受连接:

List<Client> clients = new List<Client>(); 

// incoming connection 
void AcceptConnection() 
{ 
    Client newClient = new Client(this, serverSocket.Accept()); 

    clients.Add(newClient); 
} 

所以,如果你想发送给一个或所有客户端,你可以做这样的事情:

public void SendPacketToAll() 
{ 
    foreach (Client client in this.clients) 
     client.socket.Send(...); 
} 

public void SendPacketToUserById(int id) 
{ 
    foreach (Client client in this.clients) 
     if (client.Id == id) 
      client.socket.Send(...); 
} 

希望它有帮助,祝你好运

+0

谢谢你。但是,当我想向客户端发送数据包时,我需要客户端的事件吗?当客户收到信息包时,他们会看到。 – ExclusivAtom

+0

你有两种方法可以用套接字接收数据。在客户端或服务器端。在这里的插座文档:https://msdn.microsoft.com/en-us/library/system.net.sockets.socket(v=vs.110).aspx有一个名为'BeginRevieve'的方法,需要回调方法。此方法用于异步进程。 如果你想要一个同步过程,你可以做一个while(true)语句,并且在这个循环中,你可以用'socket.Poll()'方法检查是否有可用的数据。 – Eastrall

相关问题