【问题标题】:Multi-Threaded TCP Listner (Server) in C#C# 中的多线程 TCP 侦听器(服务器)
【发布时间】:2018-05-11 13:51:37
【问题描述】:

简介: 我开发了一个用 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();
}

问题: 由于一些关键的业务需求,处理可能需要长达 5 秒的时间,因此在此期间的其他请求会排队,我需要避免这种情况,以便每个请求必须在不超过 5 秒的时间内得到处理。

查询: 我可以让它成为多线程的,但是(如果你发现我是新手,请原谅我):

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

  • 在处理多个请求的情况下,如何确保将响应发送回各自的客户端?
  • 【问题讨论】:

    • this tutorial 可能是一个好的开始。基本上,您的侦听器可以侦听多个端口,并将通过该特定端口发送到接受的客户端。这将确保到达正确的客户。
    • this video 也可能很有帮助。跳到 15:40 分钟,在 1 分钟内你应该知道它是否可以帮助你。祝你好运
    • 一些命名和代码让我想加上我通常的注意事项:TCP 提供双向的字节流不是 消息。如果您想要消息,则由 来引入消息框架或转移到为您发送消息的更高级别的协议。 Receive 仅保证在成功时返回至少 一个 字节。所以请注意len,如果您希望msgA 实际包含一个完整 消息(而不是多个消息片段),您还有更多工作要做。
    • 我会使用 TcpListener 类。它是套接字上的一个薄包装器,非常易于使用,而且您几乎可以免费使用异步(意味着它将并行运行并且您不需要“多线程”stuf)。一个例子在这里:gist.github.com/jamesmanning/2622054

    标签: c# tcplistener


    【解决方案1】:

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

    每个库都涵盖以下内容:

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

    编写生产就绪 TCP 服务器是一项艰巨的工作。除非您是具有非常具体要求的网络编程专家,否则您永远不应该从头开始编写。

    【讨论】:

    • 如果 OP 不想自己动手,那就让他来吧。无论如何,不​​要宣传某些 3rd 方库,这是某人“滚动他们自己” 的示例。如果你使用预制,你就不会学习。有这种态度的阿帕奇会在哪里? :)
    • 原始问题中的短语由于一些关键的业务需求表明,这不是学习项目,而是将用于生产的东西。恕我直言,不是试验的好地方;)
    • 没错,但你能证明这些库满足业务需求吗?
    • 写socket server的话题非常广泛。我附上的每个链接都指向带有代码 sn-ps 的文档或显示几个不同用例的示例。我相信这比一个单一的 SO 答案更能提供信息和有用。所以请告诉我,这怎么不示范?
    • MickyD 事实上,我已经为一个操作系统库做出了贡献,这更像是我的观点,而不是反对它。我做过那件事。我知道斗争。我想节省作者的时间和精力,因为他的问题表明,TCP 服务器是实现业务目标的手段,而不是目标本身。我的回答是负责任的人会提供什么建议。
    猜你喜欢
    • 2011-07-22
    • 2015-08-06
    • 1970-01-01
    • 2016-12-30
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2017-12-15
    相关资源
    最近更新 更多