当前位置: 首页 > 知识库问答 >
问题:

客户端数据如何进入服务器的子线程而不是原始侦听线程?

窦啸
2023-03-14

我的问题是关于以下场景中的客户机-服务器通信。

服务器侦听端口21,能够同时为来自客户端(C1、C2等)的多个传入连接提供服务,而不会阻塞它们

因此,当客户机C1连接到端口21上的服务器S时,服务器接受主线程上的连接,并创建一个新的线程TH1,让它处理客户机请求,同时主线程再次开始列表到端口21以接受新的客户机。

TH1将一些数据发送回客户端C1,C1将恢复数据,并在端口21上建立的同一连接上向服务器发送更多数据。

当服务器的主线程继续监听端口21时,该数据到达服务器并由线程Th1接收。

我的问题是,客户机C1在端口21上的同一连接上发送的进一步数据如何自动传输到线程Th1?即使服务器的主线程正在侦听端口21上的新连接?

共有1个答案

万俟财
2023-03-14

您需要提供任何在客户端与服务器之间发送具有唯一客户端id的包。您需要一个可区分的握手包。

当服务器收到一个握手包时,它启动一个线程,从包中给它客户端id,并继续监听端口21。

然后,线程发送所需的任何信息,比如在端口22发送给客户端,并开始监听一个条件变量

当服务器的主线程在端口21处获得一个data数据包时,它会发布id并向条件变量发出信号。其中一个等待的线程将识别该id并开始工作。或者,主线程可以创建多个队列和条件变量,每个线程一个,并且只唤醒与该id相关的单个线程。与此同时,服务器继续监听。

不要忘记在再见数据包或超时时终止线程。

 类似资料:
  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 嗯,我必须在linux上用C做一个udp服务器。 这是我的问题,例如:我知道每个线程将管理一个客户机。但是recvfrom将接受来自任何源的数据包,那么,如何才能使每个线程都能接收正确的客户端数据包,而不是其他线程? 我希望我能很好地解释我的问题。 非常感谢。 (我的意思是,我的服务器将为每个需要服务的客户端创建一个新线程。因此,对于TCP,我可以使用accept为每个线程客户端连接创建一个“专用

  • 我正在用Netty玩Spring Webflux(2.0.3.Release),并试图理解服务器和web客户端是如何使用线程的。我用WebClient编写了一些带有http调用链的代码。我怀疑所有调用都是非阻塞的,但我不明白为什么只有一个请求经过整个链路。下面是代码和日志输出: 我对localhost:8080/1进行了4次调用,并得到以下输出。只有一个请求到达了第三个方法。我希望当一个线程被阻塞

  • 问题内容: 为了进行测试,我在不同端口上本地运行网格和节点。 因此,网格在4444上运行,而节点在5556上运行。 在我的测试中,如果我以 然后测试失败,但出现异常 如果我在节点端口5555而不是集线器端口4444上运行测试,则测试通过,如下所示 我认为,我们应该在集线器端口上运行测试,在本例中为4444,而不是5555。 如果我错了,请纠正我。 问题答案: 如果你打算使用 在 通过配置 和 配置

  • 问题内容: 为了进行测试,我在不同端口上本地运行网格和节点。 因此,网格在4444上运行,而节点在5556上运行。 在我的测试中,如果我以 然后测试失败,但出现异常 如果我在节点端口5555而不是集线器端口4444上运行测试,则测试通过,如下所示 我认为,我们应该在集线器端口上运行测试,在本例中为4444,而不是5555。 如果我错了,请纠正我。 问题答案: 如果你打算使用 在 通过配置 和 配置

  • 我有一个正在Eureka服务器上注册的服务“a”,我希望Eureka服务器在每次在Eureka内注册新服务时通知该服务。有什么办法吗?