0

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

以下是我需要的要求:

  1. 多线程,我需要一个可以处理多个客户端的服务器,尽管这些客户端不需要相互通信。
  2. 连续操作,客户端连接到服务器后,需要不断地相互发送消息,直到服务器丢弃所有客户端。服务器需要识别每个客户端。客户端通常不需要自行断开与服务器的连接。
  3. 断线通知,谷歌上找到的大部分例子都没有这个功能,我需要服务器知道连接的客户端何时断开,这样服务器才能通知用户。

实际上我发现的最接近的例子是: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

但我不确定如何更改它,因为它阻止了我的表单显示。

感谢帮助。

4

1 回答 1

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 /内存。

于 2013-07-25T07:54:49.470 回答