服务器套接字在收到数据后不向客户端发送数据

时间:2016-01-30 12:26:48

标签: python sockets tcp

我正在开发一个简单的套接字程序,它应该测量使用各种大小的数据包通过网络传输数据所需的时间。程序运行正常,直到我希望服务器响应客户端,告诉客户端所有数据都已收到。您将在下面找到代码:

服务器:

def server():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('127.0.0.1',6000))
    s.listen(1)
    con,addr=s.accept()
    while 1:
        data = con.recv(1024)
        if not data:
            break
    print "Test"
    con.send("Done")
    con.close()

客户端:

def client():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.connect(('127.0.0.1',6000))
    data = ""
    for j in range(0,1024):
        data = data + "a"
    start = int(time.time()*1000.0)
    for i in range(0,15):
        s.send(data)
    data = s.recv(1024)
    if data=="Done":
        end = int(time.time()*1000.0)
        s.close()
        print str(end-start)+"ms"

正如我所说,程序运行良好,直到我尝试从服务器响应客户端。当程序到达服务器中的con.send("Done")并且它中的s.recv(1024)停止时,文本"测试"永远不会在服务器上打印。如果我在客户端中删除con.send("Done")s.recv(1024),一切运行正常,如果我删除代码以将数据从客户端发送到服务器,它运行正常,因此只从服务器发送数据

我一直在查看示例,但我找不到任何错误的代码。所以我的问题是为什么这不起作用?而且,我是否甚至需要服务器告诉客户端它已完成,或者是否有更有效的方式让客户知道服务器何时收到了所有数据?

2 个答案:

答案 0 :(得分:1)

您需要非阻塞IO或线程。否则,读操作可能会阻止您的程序,从而阻止写入进展,反之亦然。

答案 1 :(得分:0)

您需要的是线程或非阻塞连接。我刚写了a non-blocking TCP server that just runs out of the box。这是一个echo服务器:

from simpletcp.tcpserver import TCPServer

def echo(ip, queue, data):
    queue.put(data)

server = TCPServer("localhost", 5000, echo)
server.run()

这就是客户的样子:

from simpletcp.clientsocket import ClientSocket

s1 = ClientSocket("localhost", 5000, single_use=False)
response = s1.send("Hello, World!")

如果您不想使用它,则始终存在内置SocketServer

无论哪种方式,编写其他人已经为您编写的代码都没有意义。