Python套接字测试recv()数据

时间:2016-07-21 19:29:45

标签: python sockets

我的使用socket的python脚本有问题。我想测试客户端是否使用正确的文件,而不是像telnet这样的其他工具。服务器:

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'因为脚本冻结,我需要等待客户端停止并且服务器解冻。 提前谢谢。

1 个答案:

答案 0 :(得分: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