Python SocketServer从服务器发送消息

时间:2017-11-20 15:42:14

标签: python sockets network-programming socketserver

我在python中使用TCP服务器,它实现了这个类:

class ThreadedTCPServer(SocketServer.ThreadingTCPServer):
    pass

它的正常使用非常完美(启动服务器,处理请求等)。

现在 - 我需要在handle类的TcpRequestHandler(SocketServer.BaseRequestHandler)函数之外向客户端发送消息。

我尝试使用以下技巧,使用服务器的内部套接字(适用于UDP) -

tcp_server.client_socket.send(message)

但我收到此错误消息 -

socket.error: [Errno 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

所以我认为TCP是不可能的。

还有其他办法吗? 我假设有些服务器有时需要向客户端发送消息(这不仅仅是对请求的响应),但我找不到好方法。

谢谢!

1 个答案:

答案 0 :(得分:3)

TCP有两个常规选项:

  1. 在带外(OOB)向客户端发送消息。在此,服务器单独连接到客户端,角色相反。客户端必须在端口上侦听OOB消息,并在这方面充当服务器。从你的问题描述你不想这样做,这很好。
  2. 实现协议,服务器可以向客户端发送消息以响应传入的消息。您将需要一种方法将额外消息与任何预期返回值多路复用到启动消息。您可以使用服务器上的共享队列来实现此目的。您将消息放入处理程序之外的此队列中,然后当处理程序响应您从队列中使用的消息并将其插入响应时。
  3. 如果这听起来像你感兴趣的东西我可以稍后写一些示例代码。

    有优点&两种方法之间的缺点:

    在(1)中,您需要管理更多套接字连接,并将客户端主机公开给您可能不需要的连接。协议更简单,因为它们不是多路复用的。

    在(2)中,您只有一个TCP流,但您必须多路复用您的OOB消息。如果客户端不定期联系服务器,您的延迟也会增加。

    希望有所帮助。