python socketserver偶尔会停止发送(和接收?)消息

时间:2012-01-09 14:51:35

标签: python sockets socketserver

我一直遇到一个socketserver的问题我写的socketserver似乎停止在它使用的一个端口上发送和接收数据(而另一个端口继续处理数据就好了)。有趣的是,在等待一分钟(或长达一个小时左右)之后,套接字服务器将再次开始发送和接收消息,而无需任何可观察的干预。

我使用的是Eventlet socketing框架,python 2.7,所有在ubuntu aws实例上运行的东西,外部应用程序打开与socketserver的持久连接。

从我一直在做的一些阅读中,看起来我可能没有正确实现我的套接字服务器。 根据{{​​3}}:

  

套接字的基本事实:消息必须是固定长度(yuck),或者是分隔的> > (耸肩),或表明它们有多长(好多了),或者通过关闭连接来结束。

我不完全确定我在这里使用修复长度消息(或者我?)

这就是我收到数据的方式:

def socket_handler(sock, socket_type):
    logg(1,"socket_handler:initializing")
    while True:
        recv = sock.recv(1024)
        if not recv:
            logg(1,"didn't recieve anything")
            break
        if len(recv) > 5:
            logg(1,"socket handler: %s" % recv )
            plug_id, phone_sid, recv_json = parse_json(recv)
            send = 1 
            if "success" in recv_json and recv_json["success"] == "true" and socket_type == "plug":
                send = 0
            if send == 1:
                send_wrapper(sock, message_relayer(recv, socket_type))
        else:
            logg(2, 'socket_handler:Ignoring received input: ' + str(recv)  )
    logg(1,  'Closing socket handle: [%s]' % str(sock))
    sock.shutdown(socket.SHUT_RDWR)
    sock.close()

“sock”是listener.accept()函数返回的套接字对象。

socket_handler函数的调用如下:

new_connection, address = listener.accept()
...<code omitted>...
pool.spawn_n(socket_handler, new_connection, socket_type)

我的实施对任何人都不正确吗?我基本上实现了固定长度的会话协议吗?我该怎么做才能帮助调查问题或使我的代码更健壮?

提前致谢,

Ť

1 个答案:

答案 0 :(得分:2)

如果您要求在服务器(1024)上接收的字节超过您实际从客户端发送的字节数,则可能存在缓冲相关问题。

要解决这个问题,通常要做的是首先对消息的长度进行编码,然后对消息本身进行编码。这样,接收器可以获得长度字段(已知大小),然后根据解码的长度读取消息的其余部分。

注意:长度字段通常与协议中所需的字节长度相同。有些协议是4字节对齐的并且使用32位字段,但是如果你发现你有足够的1或2字节,那么你可以使用它。这里的要点是客户端和服务器都知道该字段的大小。