2012-01-09 121 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