1

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

我正在使用 Eventlet 套接字框架 python 2.7,一切都在 ubuntu aws 实例上运行,外部应用程序打开到套接字服务器的持久连接。

从我一直在做的一些阅读中,看起来我可能没有正确实现我的套接字服务器。根据http://docs.python.org/howto/sockets.html

套接字的基本事实:消息必须是固定长度(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)

我的实现对任何人来说都是不正确的吗?我基本上是在实现一个固定长度的会话协议吗?我可以做些什么来帮助调查问题或使我的代码更健壮?

提前致谢,

4

1 回答 1

2

如果您请求在服务器 (1024) 上接收比您实际从客户端发送的字节数更多的字节,您可能会遇到与缓冲相关的问题。

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

注意:长度字段通常与您的协议中需要的字节数一样多。一些协议是 4 字节对齐的,并为此使用 32 位字段,但如果您发现 1 或 2 个字节已经足够了,那么您可以使用它。这里的重点是客户端和服务器都知道这个字段的大小。

于 2012-01-09T15:11:27.640 回答