Повторяющаяся/непрерывная питона сервера и клиента



Я хотел бы создать систему, в которой у меня есть клиент 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."


Это прекрасно работает с первой попытки, но я не могу заставить сервер автоматически прослушивать следующее сообщение-он всегда зависает на "прослушивании клиента . . .".



Какие-нибудь мысли?



Спасибо!

542   2  

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

    Ничего не найдено.