2016-07-21 12 views
1

私はpythonスクリプトでソケットを使用している問題があります。クライアントがtelnetのような他のツールではなく正しいファイルを使用しているかどうかをテストしたい。サーバー:Pythonソケットテストrecv()data

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
while 1: 
    conn, addr = s.accept() 
    data = conn.recv(1024) 
    if data == 'test': 
     print 'ok' 
    else: 
     print '!' 
     conn.close() 

クライアント:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(HOST, PORT) 
s.send('test') 

クライアントは、それが正しいファイルだことを確認するために、サーバーに「テスト」を送信します。 しかし、クライアントが何も送信しない場合(クライアントが別の方法で接続する場合)、スクリプトがフリーズするためconn.recv(1024)が 'test'に等しいかどうかをテストできません。クライアントの停止を待つ必要がありますサーバーがフリーズします。 ありがとうございます。

答えて

0

ご自分のサーバは、クライアントからの新しいクライアント接続や着信データを待機する時間を制限するselect機能を使用することができます。

import socket 
import select 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 

while 1: 

    # wait up to 60 seconds that a client connects 
    newClient,_,_ = select.select([s], [], [], 60) 

    if not (newClient): 
     # no client wanted to connect 
     print 'No new client in last 60 seconds!' 
     return 
    else: 
     # new connection 
     print 'New client!'   
     conn, addr = s.accept() 
     # wait up to 60 seconds that the client send data 
     readable,_,_ = select.select([conn], [], [], 60) 
     if (readable): 
      data = conn.recv(1024) 
      if data == 'test': 
       print 'ok' 
      else: 
       print 'client do not send test' 
     else: 
      print 'client send nothing' 

     # close connection 
     conn.close() 

selectを参照してください。

+0

これはうまくいきました。わたしは、あなたを愛しています – Random123856