我已经经历了SocketServer的我写的,其中的SocketServer将似乎停止发送和接收数据就可以使用(而其他端口继续端口中的一个问题处理数据就好了)。有趣的是,在等待一分钟(或长达一个小时左右)之后,socketserver将再次开始发送和接收消息,而没有任何可观察的干预。蟒蛇SocketServer的偶尔停止发送(和接收?)消息
我使用Eventlet套接框架,Python 2.7版,对一切与外部应用打开到SocketServer的持久连接Ubuntu的AWS实例上运行。
从一些阅读中,我一直在做,它看起来像我可能无法正确执行我的套接字服务器。 根据http://docs.python.org/howto/sockets.html:
插座的基本道理:消息必须通过关闭固定长度(呸),或分隔>>(耸肩),或表明它们是多么长(更好),或端断开连接。
我不能完全肯定,我在这里使用一个固定长度的消息(还是我?)
这是我我收到我的数据:
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()
“袜子”是一个由listener.accept()函数返回的套接字对象。
的socket_handler函数被调用,像这样:
new_connection, address = listener.accept()
...<code omitted>...
pool.spawn_n(socket_handler, new_connection, socket_type)
难道我看起来执行不正确的人?我基本上实现了一个固定长度的对话协议?我能做些什么来帮助调查问题或使我的代码更健壮?
由于提前,
牛逼
谢谢,我担心这可能是问题所在。 是否的消息长度需要编码为正好等于实际的消息长度或I可以具有,比如说,一个近似如消息长度小的和大,然后读取的字节x个时收到小的消息和当我变大时xxx字节数? – tedtoy 2012-01-09 15:35:53
编辑(只是重读你的回应 - 我应该学会更好地阅读= /):你能解释缓冲问题是如何发生的吗?如果一个客户端发送500字节,但是我读到502,会怎么样?在什么时候我会开始注意到缓冲问题,以及如何检测和处理这种情况? – tedtoy 2012-01-09 15:45:09
@tedtoy当邮件在发件人编码时,通常会事先知道数据的大小。如果情况并非如此,那么可以发送多条消息(当您发送数据时,让接收方使用附加信令消息很有用)。 – jcollado 2012-01-09 15:46:04