2011-04-18 164 views
1

該應用程序是一個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() 

回答

0

IMO你的權利與使用線程。爲每個請求啓動一個線程,當它完成並有數據時,生成一個wx事件(請參閱http://wiki.wxpython.org/CustomEventClasses

+0

好吧,所以本質上有一個單獨的線程監聽套接字所有的時間和每當數據從服務器返回生成WxEvents? – asmodai 2011-04-18 13:50:43

1

我認爲您誤解了單線程還是多線程方法會使應用程序更復雜或更少。你現在正在摔跤的問題是(例如)扭曲爲你解決的許多問題之一。

人們對Twisted最常見的抱怨是它使得他們以一種他們不習慣的方式奇怪地構造他們的代碼。但是,當您使用像wxPython這樣的GUI庫時,您已經接受了這個約束。 Twisted的事件驅動架構與所有流行的GUI工具包的事件驅動架構完全相同。只要你繼續使用wxPython,Twisted也不會強迫你做任何事情,你不想做任何事情else。另一方面,切換到線程將意味着您需要非常小心訪問共享數據結構,您將無法有效地進行單元測試,並且出現的許多問題只會在其他人正在運行您的應用程序 - 因爲它們的內核數量不同於您的內核,或者它們的網絡具有不同的延遲特性,或者導致您的線程代碼以您從未體驗過的方式運行的許多其他內容。非常小心,你仍然可以寫出一些有用的東西,但這會變得更加困難。

由於您尚未在此處發佈任何基於Twisted的代碼,因此我無法給出有關如何使事情儘可能簡單的任何具體建議。不過,我建議您再看一下非線程解決方案。加入[email protected]郵件列表,在freenode上跳轉#wisted,或發佈更多關於它的stackoverflow問題。很多人會急於幫助。 :)

+0

嗨讓 - 保羅,我們過去曾經談過我正在編寫的代碼。我在代碼庫中加入了Twisted來處理網絡和異步方面的問題,但最終代碼在維護和易於向其他人解釋方面變得笨拙。除此之外還有一個事實,那就是我需要引入一些屏障作爲同步點,大概一年前你說過的東西會在Twisted中出現問題。 由於我已經完全從代碼庫中刪除了Twisted,我正在使用線程繼續沿着這條通道走下去。謝謝你提供的幫助。 – asmodai 2011-04-19 12:03:57

相關問題