2017-04-06 15 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)link:after killing the terminalです。誰もこれを解決する方法を考えている?あなたの助けに感謝!

+0

おそらく、サーバーはあなたのソケットに何も送信しないで、永遠に待っていますか?まず何かを送ってから応答を待ちます。受信のタイムアウトを定義することもできます。 – Szabolcs

+0

サーバーはハッシュされた16進文字列が正しいかどうかをチェックし、正しい場合は別の16進コード化バイト文字列を送信し、プロセスは500回実行されます。間違っていると、すぐに終了します。それは私が端末でnetcatを使用すると動作しますが、何とか私はソケットを使用すると動作しません。 – Shaoz

+0

私は途中で何かを送ろうとしましたが、同じ問題があります – Shaoz

答えて

0

s.recv(bufferSize)という行は、サーバーからの受信データがまだあるのを待っています。しかし、サーバーはあなたが見るもの以上のものを送信しません。 hexReply変数でサーバーに返信し、何が起こるかを確認してください。 printステートメントの後にs.send(hexReply + "\r\n")を挿入してください。

+0

これは、 "\ r \ n"をhexReplyの後ろに追加した後に機能します!ありがとう! – Shaoz

+0

@Shaoz問題が解決しない場合は、あなたの質問に解決済みのマークを付けてください。 –

関連する問題