如何实现带有ack机制的非阻塞tcp服务器?



>我是多线程Web服务器编程的新手 现在我正在编写一个服务器程序,它:

  1. 从 TCP 套接字接收消息(以自定义数据格式)
  2. 处理这些消息(需要时间)
  3. 向套接字发送相应的响应
  4. 提供接收消息和发送响应的 ACK 机制,即每条消息都包含一个唯一的 seq 号,我应该在相应的响应中包含 ack(与 seq 相同)。另一方也实施这一机制。如果我在 5 分钟内没有收到对方的 ACK,我应该重新发送我希望从中收到相应 ACK 的消息。

我的想法是使用 while 循环从套接字接收消息,然后处理消息并发送响应。

问题是,处理消息需要时间,我可能会在短时间内收到多条消息。因此,如果我在这个 while 循环中调用 process_message() 函数并等待它完成,它将被阻塞,我肯定会浪费时间。所以我需要非阻塞方式。

我做了一些研究。我想我可以使用两种常见的技术:线程池和消息队列。

对于线程池,我的想法类似于以下伪代码:

def process_message():
process_message // takes time
send_response(socket)
while True:
message = recv(socket)
thread = thread_pool.get_one()
thread.start(target=process_message)

对于消息队列,我不确定,但我的想法是拥有生产者线程和消费者线程:

def consumer:
// only one consumer thread?
message = queue.poll()
consumer_thread.process_message(message)
send_response(socket)

while True:
// only one producer thread?
message = recv(socket)
producer_thread.put_message_to_queue()

希望我的想法很清楚。任何人都可以提供一些典型的解决方案吗?

那么,更棘手的部分,关于如何实现 ACK 机制的任何想法?

谢谢!

这是相当广泛的,因为仍然有太多的东西要实现。

总体思路确实是实现:

  • TCP服务器,它将接收传入的消息并将其写入队列(包括接收消息的套接字)
  • 一个工作线程池,它将从队列中获取消息,处理消息,并将响应传递给负责发送消息并等待确认的对象
  • 一个对象,它将发送响应,存储序列号、套接字和消息,直到响应得到确认。线程可以方便地处理等待确认的消息列表,并在超时用完时再次发送它们。

但是每个部分都需要大量的工作,并且可以以不同的方式实现(selectTCPServer或线程处理第一个接受的套接字,哪个数据结构来存储等待第三个确认的消息,以及第二个池实现)。我做了一些测试,并意识到完整的答案将远远超出本网站的预期。恕我直言,你最好把问题分成更小的可回答部分,把这个问题作为一般背景。

您还应该说明传入消息是在收到时立即确认,还是应由响应隐式确认。

最新更新