C#中的多线程TCP Listner(服务器)

SAM*_*SAM -4 c# tcplistener

简介: 我开发了一个用C#开发的服务器(TCP侦听器)程序,它在特定(常量)端口的特定(常量)IP上运行.该服务器程序接收客户端程序发送的数据包,对其进行处理并将数据包发送回同一个套接字.虽然此服务器的客户端程序数量可能为数百个:

代码示例

while(true)
{
    socket = Host.AcceptSocket();
    int len = socket.Receive(msgA);

    performActivities(msgA); // May take up-to 5 seconds

    socket.Send(msgB);
    socket.Close();
}
Run Code Online (Sandbox Code Playgroud)

问题: 由于一些关键的业务需求,处理可能需要5秒钟,因此在此期间的其他请求排队,我需要避免,以便每个请求必须在不超过5秒的时间内受理.

查询: 我可以让它多线程但是(请原谅我,如果你找到我新手):

  • 如果一个套接字仍由前一个线程打开,它将如何接收来自不同客户端的另一个数据包?

  • 在娱乐多个请求的情况下,如何确保将响应发送回各个客户端?

  • Bar*_*ski 9

    构建高效的多线程套接字服务器需要该领域的强大知识和技能.我的建议不是尝试从头开始构建自己的TCP服务器,而是使用已经解决了这个问题的现有库之一.我想到的几件事是:

    这些库中的每一个都包含以下内容:

    • 管理TCP连接生命周期.
    • 高效管理字节缓冲区.byte[]为每个包装分配新的效率非常低,并导致很多GC压力.
    • 安全访问套接字API(默认情况下套接字不是线程安全的).
    • 缓冲传入的数据包.
    • 处理程序/管道/阶段形式的抽象,允许您组合和操作二进制有效负载以进行进一步处理.这特别有用,即当你想根据消息操作输入数据时 - 默认情况下,TCP是二进制流,它不知道管道中的一条消息何时结束而另一条消息何时开始.

    编写生产就绪的 TCP服务器是一项巨大的工作.除非您是具有特定要求的网络编程专家,否则不应该从头开始编写.

    • 如果OP不想自己动手让他.不要推广一些第三方lib,这是某人的一个例子_无论如何都要"滚动自己".你不知道你是否使用预制造.阿帕奇会以这种态度在哪里?:) (3认同)
    • 短语*由于原始问题的一些关键业务要求*表明,这不是学习项目,而是将用于生产的东西.不是试验恕我直言的好地方;) (2认同)
    • MickyD事实上,我为操作系统库提供了帮助,这对我的意见更具争议性,而不是反对它.我做过那件事.我知道这场斗争.我想节省作者的时间和神经,因为他的问题表明,TCP服务器是实现业务目标的手段,而不是目标本身.我的答案是负责人会建议的. (2认同)