重复/持续的Python服务器和客户端
我想建立一个系统,让我的 Python 客户端和服务器可以不断地发送和接收数据。我找到的所有代码示例都只展示了如何向一个套接字发送单个消息,但没有说明如何持续地发送和接收数据。
现在我的代码是:
client.py
import socket
import time
while True:
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("192.168.0.250", 10220))
data = "GET\nSONAR\n\n"
print 'send to server: ' + data
client_socket.send(data)
client_socket.close()
except Exception as msg:
print msg
我希望代码能够每分钟发送多个命令,但现在似乎没有稳定地发送消息,我也不太明白为什么。为什么控制流不是连续的呢?
server.py
import socket
host = '192.168.0.100'
port = 8220
address = (host, port)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((address))
server_socket.listen(5)
while True:
try:
print "Listening for client . . ."
conn, address = server_socket.accept()
print "Connected to client at ", address
#pick a large output buffer size because i dont necessarily know how big the incoming packet is
output = conn.recv(2048);
if output:
print "Message received from client:"
print output
#conn.send("This is a response from the server.")
conn.close()
#print "Test message sent and connection closed."
第一次运行时这个是可以的,但我不能让服务器自动再次监听下一个消息——它总是停在“正在监听客户端...”这一步。
有什么想法吗?
谢谢!
2 个回答
-3
你最好使用两个 while 循环,并加上 try 块和服务器套接字,这样你就可以不断地接收来自客户端的信息,反过来也可以发送信息。
11
这段代码对我来说运行得很好,不过我需要在client.py里调整端口号,让它和server.py里的端口号一致。此外,我还得在server.py里添加一个异常处理,这样才能在程序运行时按下键盘中断(KeyboardInterrupt)来退出程序。
正在监听客户端 . . .
成功连接到客户端,地址是 ('127.0.0.1', 53944)
从客户端收到的消息:
GET
SONAR
正在监听客户端 . . .
成功连接到客户端,地址是 ('127.0.0.1', 53945)
从客户端收到的消息:
GET
SONAR
编辑:
我尝试改进了一下架构。我创建了一个连接,用它来传递多个消息,每次发送消息后,客户端会暂停一下,等待服务器发送确认。
client.py:
import socket
import time
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 8220))
for index in xrange(5):
data = "GET\nSONAR%d\n\n" % index
print 'send to server: ' + data
client_socket.send(data)
while client_socket.recv(2048) != "ack":
print "waiting for ack"
print "ack received!"
#send disconnect message
dmsg = "disconnect"
print "Disconnecting"
client_socket.send(dmsg)
client_socket.close()
server.py:
import socket
import sys
host = 'localhost'
port = 8220
address = (host, port)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(address)
server_socket.listen(5)
print "Listening for client . . ."
conn, address = server_socket.accept()
print "Connected to client at ", address
#pick a large output buffer size because i dont necessarily know how big the incoming packet is
while True:
output = conn.recv(2048);
if output.strip() == "disconnect":
conn.close()
sys.exit("Received disconnect message. Shutting down.")
conn.send("dack")
elif output:
print "Message received from client:"
print output
conn.send("ack")