該應用程序是一個WxPython客戶端/服務器設置,它有多個客戶端連接到服務器並參與雙工網絡協議。Python網絡客戶端,試圖響應服務器響應
過去我已經把Twisted與AMP聯繫起來了,但是它並沒有完全爲應用程序中的架構而削減它,最終沒有過分複雜化。
因此,對於服務器我有SocketServer與ThreadingMixIn設置。目前我正在處理服務器的緩衝區/命令隊列,但這不是問題。
在客戶端,我可以做所有正常的數據發送,由UI中的事件觸發,沒有太多問題。我目前堅持試圖讓客戶端在不阻塞整個應用程序的情況下監聽響應。所以我想把它放在一個線程中,但是它應該從現在註釋掉的部分開始還是應該完全不同的處理,而我只是沒有看到它?
簡而言之:我希望客戶端發送命令到服務器,並監聽任何響應而不阻塞/停止整個應用程序。
下面的代碼是原型代碼,請原諒任何典型的錯誤,如魔法值和其他硬編碼數據,它會在最終代碼中有所不同。
import socket
import threading
import time
class CommandProxy(object):
def __init__(self, host, port):
self.host = host
self.port = port
def close(self):
if self.connection:
self.connection.close()
def connect(self):
try:
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect((self.host, self.port))
except socket.error as e:
print "Socket error: {0}".format(e)
def send_command(self, command, *kw):
datalist = ' '.join(kw)
data = command + ' ' + datalist + '\x00'
print 'DATA: {0}'.format(data)
self._write(data)
# while True:
# data = self._read()
# if data == 0:
# break
#
# print "DATA RECEIVED: {0}".format(data)
def _read(self):
data = self.connection.recv(1024)
return data
def _write(self, bytes):
self.connection.sendall(bytes)
if __name__ == '__main__':
HOST, PORT = 'localhost', 1060
proxy = CommandProxy(HOST, PORT)
proxy.connect()
try:
while True:
proxy.send_command('ID', '1')
time.sleep(2)
except KeyboardInterrupt:
print "Interrupted by user"
except socket.error as e:
print "Socket error: {0}".format(e)
except Exception as e:
print "something went wrong: {0}".format(e)
finally:
proxy.close()
好吧,所以本質上有一個單獨的線程監聽套接字所有的時間和每當數據從服務器返回生成WxEvents? – asmodai 2011-04-18 13:50:43