2011-05-31 73 views
2

我正在擴展一個遠程控制機器人的GUI程序。這個想法是用Python編寫一個簡單的GUI客戶端,該客戶端連接到一個也是用Python編寫的遠程服務器。客戶端將發送簡單的消息到服務器,服務器會收到消息,然後通過串行傳輸到通過USB連接的Arduino MegaPython套接字服務器和客戶端不斷失去連接

我已經得到了代碼工作,種。

現在,我可以從我的客戶端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。

+1

避免裸露的除外,它們可以隱藏各種錯誤。另外,在if的序列互斥的地方使用「elif」。 – MRAB 2011-05-31 02:22:20

回答

2

您正在呼叫accept()內循環,這將阻止其他連接。當/如果有另一個連接進來時,原始連接將被取消引用並自動關閉。通常,您生成一個獨立的處理程序(fork,線程或添加到異步事件處理程序)來處理執行該工作的新連接。

相關問題