Сервер сокетов Python и клиент, продолжает терять соединение - PullRequest
2 голосов
/ 31 мая 2011

Я расширяю программу с графическим интерфейсом для робота с дистанционным управлением.Идея состоит в том, чтобы запрограммировать простой клиент с графическим интерфейсом на Python, который подключается к удаленному серверу, также написанному на Python.Клиент отправляет простые сообщения на сервер, сервер получает сообщение, а затем передает его через последовательный порт на Arduino Mega , который подключен через USB.

Я получил кодна работу, вроде.

Прямо сейчас я могу подключиться один раз из моего клиентского Python GUI, отправить одно сообщение, затем он теряет соединение.Затем я должен остановить сервер, перезапустить его и отправить еще одно сообщение.

Что здесь происходит?

Вот сценарий сервера, принятый из другого источника.

import serial
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9000))
sock.listen(1)
print "Listening on TCP 9000"
motor = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
print "Connected to Arduino Mega at: /dev/ttyUSB0"
while(1):
    print "Waiting For Connection..."
    connection, addr = sock.accept()
    connection.setblocking(0)
    print "Connected by", addr[0]
    while(1):
        try:
            sockdata = connection.recv(1)
            break
        except:
            pass
    if sockdata == 'X':
        print "Exiting"
        break
    if sockdata == '0':
        print "Stopping"
        motor.write(sockdata)
    if sockdata == '1':
        print "Forward"
        motor.write(sockdata)
    if sockdata == '2':
        print "Left"
        motor.write(sockdata)
    if sockdata == '3':
        print "Right"
        motor.write(sockdata)
    if sockdata == '4':
        motor.write(sockdata)
        print "Backwards"
    else:
        pass

А вот мой код клиента, за исключением, конечно, файла ресурсов.

from socket import *
from PythonCard import model
HOST = ''
PORT = 9000
ADDR = (HOST,PORT)

Client = socket (AF_INET,SOCK_STREAM)
Client.connect((ADDR))

class MainWindow(model.Background):
    def on_FwdBtn_mouseClick(self, event):
        Client.send('1')
    def on_LftBtn_mouseClick(self, event):
        Client.send('2')
    def on_RitBtn_mouseClick(self, event):
        Client.send('3')
    def on_RevBtn_mouseClick(self, event):
        Client.send('4')
    def on_StpBtn_mouseClick(self, event):
        Client.send('0')
    def on_GetPing_mouseClick(self, event):
        Client.send('~')


app = model.Application(MainWindow)
app.MainLoop()

РЕДАКТИРОВАТЬ

После изучения нижеисправления или, по крайней мере, некоторые из них, вот мой код для сервера, клиент остается прежним.

import serial
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9001))
sock.listen(1)
print "Listening on TCP 9001"
motor = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
print "Connected to Motor Controller: /dev/ttyUSB0"
print "Waiting For Connection..."
connection, addr = sock.accept()
connection.setblocking(0)
while(1):

    print "Connected by", addr[0]
    while(1):
        try:
            sockdata = connection.recv(1024)
            break
        except:
            pass
    if sockdata == 'X':
        print "Exiting"
        break
    if sockdata == '0':
        print "Stopping"
        motor.write(sockdata)
    if sockdata == '1':
        print "Forward"
        motor.write(sockdata)
    if sockdata == '2':
        print "Left"
        motor.write(sockdata)
    if sockdata == '3':
        print "Right"
        motor.write(sockdata)
    if sockdata == '4':
        motor.write(sockdata)
        print "Backwards"
    else:
        pass

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

". Подключено с 127.0.0.1."" Вперед "" Подключено с 127.0.0.1 "" left "" Подключено с 127.0.0.1 "" right "" Подключено с 127.0.0.1 "

Выглядит так, как будто каждый раз, когда я посылаю командуЯ переподключился.Я хочу поддерживать соединение, как только я запускаю свой графический интерфейс, а не отключать и заново подключаться при каждой отправке команды.Извините, если я звучу глупо, но я только начал работать с Python около трех недель назад.

1 Ответ

2 голосов
/ 31 мая 2011

Вы звоните accept() внутри цикла, который заблокирует другое соединение. Исходное соединение будет разыменовано и автоматически закрыто, когда / если будет установлено другое соединение. Обычно вы создаете независимый обработчик (разветвление, поток или добавление в асинхронный обработчик событий) для обработки новых соединений, которые выполняют эту работу.

...