我正在擴展一個遠程控制機器人的GUI程序。這個想法是用Python編寫一個簡單的GUI客戶端,該客戶端連接到一個也是用Python編寫的遠程服務器。客戶端將發送簡單的消息到服務器,服務器會收到消息,然後通過串行傳輸到通過USB連接的Arduino Mega。Python套接字服務器和客戶端不斷失去連接
我已經得到了代碼工作,種。
現在,我可以從我的客戶端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
這個工程稍好一點,但仍然不正確我不認爲。當我運行此我得到的服務器上運行,並開始我的GUI後,我可以看在服務器上我的終端窗口,將獲得實際的命令,因爲他們來通過
「從127.0.0.1連接」「前進「 ‘從127.0.0.1’,‘左’ ‘從127.0.0.1連接’‘正確連接’ ‘從127.0.0.1’
看起來,每一次,雖然我派我得到重新連接命令連接。我想在啓動GUI時保持連接,而不是每次發送命令時斷開連接並重新連接。 對不起,如果我聽起來有點愚蠢,但我大約三週前剛剛開始使用Python。
避免裸露的除外,它們可以隱藏各種錯誤。另外,在if的序列互斥的地方使用「elif」。 – MRAB 2011-05-31 02:22:20