【问题标题】:[C#]Socket programming, Client interface [closed][C#]Socket programming, Client interface [closed]
【发布时间】:2016-10-05 07:58:58
【问题描述】:

我有一个正在运行的客户端/服务器多线程程序。 我的问题是,我如何选择任何客户端并从服务器向他发送数据包?

【问题讨论】:

  • 如果您的程序是通过 TCP 套接字连接的,那么每个客户端将在服务器中存储一个套接字。将消息发送到相关套接字。
  • 是的,我使用 TCP 套接字。但我总是为新客户创建一个新的套接字。我还需要一个“列表”,但是哪个?
  • 是的,您为每个客户端创建一个新套接字,因此如果您想向一个客户端发送消息,请通过您为该客户端存储的套接字发送它。如果您不知道哪个套接字用于哪个客户端,但您需要将其发送到特定客户端,那么您需要从每个客户端发送足够的信息以允许服务器确定哪个客户端是哪个客户端。但这完全在您自己的控制之下。
  • 是的,我明白,但是当我想向客户端发送数据包时,我需要客户端的事件吗?客户在收到数据包时看到的。
  • 我想我不明白你的问题。将数据发送到正确客户端的套接字。在该客户端中,从其套接字读取数据包。就是这样。

标签: c# sockets server client


【解决方案1】:

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

客户端类:

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(...);
}

希望对你有帮助,祝你好运

【讨论】:

  • 谢谢你。但是当我想向客户端发送数据包时,我是否需要客户端的事件?客户端在收到数据包时看到的。
  • 您有两种使用套接字接收数据的方法。在客户端或服务器端。在此处的套接字文档中:msdn.microsoft.com/en-us/library/… 有一个名为 BeginRevieve 的方法,它采用回调方法。此方法用于异步进程。如果您想要一个同步过程,您可以执行while (true) 语句,在此循环中,您可以使用socket.Poll() 方法检查是否有可用数据。