我已經經歷了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