Python回声客户端中socket.send仅工作一次
我有一段代码,用于一个回声客户端,它通过套接字连接向一个回声服务器发送数据:
echo_client.py
import socket
host = '192.168.2.2'
port = 50000
size = 1024
def get_command():
#..Code for this here
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while 1:
msg = get_command()
if msg == 'turn on':
s.send('Y')
elif msg == 'turn off':
s.send('N')
elif msg == 'bye bye':
break
else:
s.send('X')
data = s.recv(size)
print 'Received: ',data
s.close()
echo_server.py
import socket
host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
client, address = s.accept()
data = client.recv(size)
if data:
client.send(data)
client.close()
我遇到的问题是,在客户端中,s.send 只在第一次有效,尽管它在一个无限循环中。客户端在第一次发送/接收完成后不久就崩溃,提示连接超时。
为什么 s.send 只工作一次呢?我该如何在我的代码中修复这个问题?
请帮帮我,谢谢!
2 个回答
2
你的问题在于,你在服务器的循环中阻塞在了accept
这个地方。
这意味着服务器在等待接收来自多个客户端的连接。如果你想要这样做,并且希望每个客户端可以发送多个命令,那么你需要在接收到连接后,开启一个新的线程(或者进程),在那个线程/进程中再用一个新的循环来处理与客户端的通信。
如果你想让你的例子只处理一个客户端,你需要把accept
放到循环外面,像这样:
client, address = s.accept()
while 1:
data = client.recv(size)
if data:
client.send(data)
5
你的服务器代码只调用了一次 recv
。如果你只想接收一个连接,应该只调用一次 accept
,但是之后你需要不断地循环调用 recv
和 send
。