我有一个 echo客户端的代码,它使用套接字连接将数据发送到 echo服务器:
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只能工作一次?我如何在我的代码中修复此问题?
请帮助 谢谢
答案 0 :(得分:5)
您的服务器代码只调用recv
一次。如果您只想接收一个连接,则应该拨打accept
一次,然后您需要循环调用recv
和send
。
答案 1 :(得分:1)
您的问题是您在服务器循环内的accept
上阻止。
这期望服务器接受来自多个客户端的连接。如果你想要,并且每个客户端发送多个命令,你需要在accept之后产生一个新的线程(或进程),在该线程/进程中使用一个新的while循环(用于客户端通信)。
要修复您的示例以仅使用一个客户端,您需要在循环外移动接受,如下所示:
client, address = s.accept()
while 1:
data = client.recv(size)
if data:
client.send(data)