2016-07-21 83 views
1

我有一個使用套接字的python腳本的問題。我想測試客戶端是否使用正確的文件,而不是像telnet這樣的其他工具。服務器:Python套接字測試recv()數據

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