我正在开发一个简单的套接字程序,它应该测量使用各种大小的数据包通过网络传输数据所需的时间。程序运行正常,直到我希望服务器响应客户端,告诉客户端所有数据都已收到。您将在下面找到代码:
服务器:
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)
,一切运行正常,如果我删除代码以将数据从客户端发送到服务器,它运行正常,因此只从服务器发送数据
我一直在查看示例,但我找不到任何错误的代码。所以我的问题是为什么这不起作用?而且,我是否甚至需要服务器告诉客户端它已完成,或者是否有更有效的方式让客户知道服务器何时收到了所有数据?
答案 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。
无论哪种方式,编写其他人已经为您编写的代码都没有意义。