C#TCP多线程服务器和客户端有要求

时间:2013-04-01 07:00:35

标签: tcp

我目前正在研究TCP多线程服务器和用C#编写的客户端。我在Google上四处寻找并尝试了超过5个示例,但似乎没有一个可以满足所有要求。由于我不熟悉网络,所以如果有人能指出我正确的方向,我们将不胜感激。

以下是我需要的要求:

  1. 多线程,我需要一台可以处理多个客户端的服务器,尽管这些客户端不需要相互通信。
  2. 连续操作,在客户端连接到服务器之后,他们需要不断向对方发送消息,直到服务器丢弃所有客户端。服务器需要识别每个客户端。客户端通常不需要与服务器断开连接。
  3. 断开连接通知,Google上发现的大部分示例都没有此功能,我需要服务器知道连接的客户端何时断开连接,因此服务器可以通知用户。
  4. 实际上我发现的最接近的例子是: http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class

    但是我面临的问题是消息是在类Token中,我在我的Window Form Application中包含了所有这些类,这是我的主要应用程序。客户ID,客户端状态或对客户的操作等信息将在表单中执行。我不知道如何将这些变量从Token类带到我的表单。

    这是另一个似乎适合我的目的的例子: http://www.codeproject.com/Articles/2866/Multi-threaded-NET-TCP-Server-Examples

    但我不知道如何更改它,因为它阻止我的表格显示。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

几个月后......首先,你必须记住窗口形式不是异步本机,你必须实现调用方法来使用tcp AsyncCallback。在其他地方处理客户端,您必须创建一个新的字典,如:

Dictionary<string, System.Net.Sockets> clientList; 

对于数据库ID,它可以是int,或者只是您可以使用本机系统句柄:

this.anonymousSock.Client.Handle

并像这样添加:

clientList.Add("ID", this.anonymousSock);

最终:

public void Send(string data, string id)
    {
        Socket Client = this.clientList[id];
        byte[] byteData = Encoding.ASCII.GetBytes(data);
        Client.BeginSend(byteData, 0, 
            byteData.Length, 0, 
            new AsyncCallback(SendCallback), Client);
    }

在接收时,您可以通过检查套接字条目或使用令牌来识别客户端。

然后没有cpu /内存刻录线程。