2012-01-09 59 views
1

我已经经历了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) 

难道我看起来执行不正确的人?我基本上实现了一个固定长度的对话协议?我能做些什么来帮助调查问题或使我的代码更健壮?

由于提前,

牛逼

回答

2

你可能得了,如果你请求在服务器(1024)比你实际上是从客户端发送到接收更多的字节缓存相关的问题。

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

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

+0

谢谢,我担心这可能是问题所在。 是否的消息长度需要编码为正好等于实际的消息长度或I可以具有,比如说,一个近似如消息长度小的和大,然后读取的字节x个时收到小的消息和当我变大时xxx字节数? – tedtoy 2012-01-09 15:35:53

+0

编辑(只是重读你的回应 - 我应该学会更好地阅读= /):你能解释缓冲问题是如何发生的吗?如果一个客户端发送500字节,但是我读到502,会怎么样?在什么时候我会开始注意到缓冲问题,以及如何检测和处理这种情况? – tedtoy 2012-01-09 15:45:09

+0

@tedtoy当邮件在发件人编码时,通常会事先知道数据的大小。如果情况并非如此,那么可以发送多条消息(当您发送数据时,让接收方使用附加信令消息很有用)。 – jcollado 2012-01-09 15:46:04