专用协议的长寿命多线程客户端(Python、select、epoll)
第一件事是,我是一个长期的潜伏者,但第一次用户,我想感谢你们所有人创建的网站 我的情况是,我需要实现专有协议的客户端部分。协议下面使用TCP/IP,消息流可总结如下:专用协议的长寿命多线程客户端(Python、select、epoll),python,asynchronous,client,asyncsocket,Python,Asynchronous,Client,Asyncsocket,第一件事是,我是一个长期的潜伏者,但第一次用户,我想感谢你们所有人创建的网站 我的情况是,我需要实现专有协议的客户端部分。协议下面使用TCP/IP,消息流可总结如下: 客户端连接到服务器 客户表示对某种类型的数据感兴趣 如果服务器有任何这样的数据,它会发送到客户端 客户端向服务器确认接收 客户机现在需要告诉服务器它仍然对相同类型的数据感兴趣 服务器在数据进入时将数据发送到客户端 客户端需要不时地(比如每分钟左右)向服务器发送应用程序级别的保持活动请求 来自服务器的某些消息要求客户端将回复发送回服
非常非常感谢 每个线程(每个客户端)都可以打开自己的套接字吗?在这种情况下,这都不是问题:只有一个线程中的客户端在该套接字上有句柄,因此它会自动从服务器获取正确的数据。对于服务器,来自客户端的所有这些连接看起来都像是完全独立的客户端连接(这正是它们的本质) 如果其中一个要求是限制网络连接的总数,那么您可以构造一个特殊的线程来维护与服务器的连接,并在本地接收来自不同线程的通信请求/但是使用独立套接字(每个线程一个)可能要简单得多 您是否一定要使用应用程序级keepalive?因为TCP可以自动为您执行此操作。如果未及时收到keepalive,则套接字将关闭,从而通知另一端连接已超时。如果你的情况下有可能,请考虑这是一个选项。
最后,如果您不必执行应用程序级别的keepalive,那么您可以利用多线程编程的一个优点:将每个线程开发为只有一个线程,这样您就不必担心任何异步问题。例如,您可以编写客户端发送请求,然后阻塞等待响应,进行计算,然后发送结果或检查是否有来自服务器的更多数据到达。来自服务器的数据将累积在您一侧的TCP接收窗口中。这也可以作为流量控制的一种手段:如果您的客户端变得太慢,并且接收窗口已满,那么服务器将无法再发送。这可能会阻塞服务器,因此您需要查看服务器是否可以处理这种情况。每个线程(每个客户端)是否可以打开自己的套接字?在这种情况下,这都不是问题:只有一个线程中的客户端在该套接字上有句柄,因此它会自动从服务器获取正确的数据。对于服务器,来自客户端的所有这些连接看起来都像是完全独立的客户端连接(这正是它们的本质) 如果其中一个要求是限制网络连接的总数,那么您可以构造一个特殊的线程来维护与服务器的连接,并在本地接收来自不同线程的通信请求/但是使用独立套接字(每个线程一个)可能要简单得多 您是否一定要使用应用程序级keepalive?因为TCP可以自动为您执行此操作。如果未及时收到keepalive,则套接字将关闭,从而通知另一端连接已超时。如果它是POS,请考虑这是一种选择。