2017-04-06 51 views
0

我目前正在處理我的任務,並且正在使用python套接字通過終端進行連接。但是,在我將消息發送到服務器並嘗試收到其答覆之後,我遇到了一個問題,它會掛起。我的代碼如下:發送消息後,Python無法收到服務器

import socket 
import sys 
import md5 
import re 

hostname = "cs2107.spro.ink" 
ip = socket.gethostbyname(hostname) 
port = 9000 
server_address = (ip, port) 
bufferSize = 1024 

# Socket connection 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print >>sys.stderr, 'connecting to %s port %s' % server_address 
s.connect((ip, port)) 

try: 
    while True: 
     data = s.recv(bufferSize) 
     if not data: 
      break 

     print data 

     regex = re.compile(r'\n([0-9a-fA-F]+)(?:\n)', re.I | re.S | re.M) 
     checkHex = re.findall(regex, data) 

     if len(checkHex) != 0: 
      receiveHex = str(checkHex).strip("['']") 
      decode = receiveHex.decode() 

      m = md5.new() 
      m.update(decode) 
      hexReply = m.hexdigest() 
      s.sendall(hexReply.encode()) 
      print hexReply 


finally: 
    print >>sys.stderr, 'closing socket.....' 
    s.close() 

輸出顯示在鏈接:output。我殺了它之後,它說最近的調用是'data = s.recv(bufferSize)鏈接:after killing the terminal。任何人有任何想法如何解決這個問題?感謝你的幫助!

+0

也許服務器沒有發送任何東西給你的套接字,它會一直等到永遠?首先嚐試發送一些內容,然後等待響應。您也可以定義接收超時。 – Szabolcs

+0

服務器將檢查散列的十六進制字符串是否正確,如果正確,它將發送另一個十六進制編碼的字節字符串,並且該過程繼續進行500次。如果錯誤,它將立即結束。它工作時,我在終端使用netcat,但它不工作時,我使用套接字.. – Shaoz

+0

我試着發送一些東西在中間,並得到了同樣的問題 – Shaoz

回答

0

s.recv(bufferSize)仍在等待來自服務器的一些傳入數據。然而,服務器發送的只不過是你所看到的。嘗試用你的hexReply變量回復服務器,看看會發生什麼。只需在print聲明後插入s.send(hexReply + "\r\n")即可。

+0

它在hexReply背後加上「\ r \ n」後就可以使用!謝謝! – Shaoz

+0

@Shaoz如果您沒有其他問題,請將您的問題標記爲已解決。 –

相關問題