Повторяющаяся/непрерывная питона сервера и клиента
Я хотел бы создать систему, в которой у меня есть клиент 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 = "GETnSONARnn"
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 ответов:
Это на самом деле работает нормально для меня, хотя мне пришлось настроить порт в client.py чтобы соответствовать одному в server.py. мне также пришлось добавить исключение для обработки KeyboardInterrupt в server.py значит, есть способ выйти из программы.
Прослушивание клиента . . . Подключено к клиенту по адресу ('127.0.0.1', 53944) Сообщение, полученное от клиента: ПОЛУЧИТЬ Гидролокатор
Прослушивание клиента . . . Подключено к клиенту по адресу ('127.0.0.1', 53945) Сообщение, полученное от клиент: ПОЛУЧИТЬ Гидролокатор
Правка:
Я сделал попытку улучшить архитектуру. Я создаю одно соединение и использую его для передачи нескольких сообщений, делая паузу между каждым из них в клиенте, чтобы дождаться подтверждения от сервера.
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")
Вам лучше открыть два цикла while с try block и сокетом сервера, тогда вы сможете получать непрерывные сообщения от клиента и наоборот.
Comments