我一直在遇到我写的套接字服务器的问题,其中套接字服务器似乎停止在它使用的一个端口上发送和接收数据(而另一个端口继续处理数据就好了)。有趣的是,在等待一分钟(或长达一小时左右)之后,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)
我的实现对任何人来说都是不正确的吗?我基本上是在实现一个固定长度的会话协议吗?我可以做些什么来帮助调查问题或使我的代码更健壮?
提前致谢,
吨