Re: [問題] socketserver & ThreadingTCPServer
※ 引述《tyc5116 (累人啊....)》之銘言:
: 如題,有兩個問題,參考官方的文件
: https://docs.python.org/3.3/library/socketserver.html
: 基本的通訊沒問題,但有訊息截取的問題
: 官方文件是將接收到的文件直接print出來,我現在想要的是
: self.Server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
: self.m_thread_Monitor.start()-->會啟動thread,
: 內有無限迴圈執行server.serve_forever()
: ...
: aaa = server.getrecvdata()-->類似這樣將server接收到的傳出來
: print(aaa)
: 不知該如何修改?
: 以及另一個問題,我以為將上述的宣告改為
: self.Server =
: socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
: 會直接幫我們處理thread的問題,但是主視窗還是會卡住
: 請問該怎麼改?
我先確認一下
所以你的需求應該是, 有個 GUI 程式想跑一個 TCP server
然後想讓它在背景跑(不會 block GUI thread)
並且把收到的東西傳給別人(例如顯示在視窗上)這樣?
建議在問問題的時候直接講你要什麼, 而不是問「這個東西要怎麼做」
因為你理解的解法可能根本就不對, 這樣別人給你的建議也會完全錯誤
如果你直接說「想要什麼」與「現在有什麼」, 溝通會比較順利
回到原本的問題, 假設你真的是要這兩個東西
第一個需求的解法就是開 thread 來處理, 這個方向沒錯
但 ThreadingTCPServer 是會在每次呼叫 handle() 的時候開 thread(文件有提到)
雖然它的 handle() 不會 block GUI thread, 但在等 request 的時候仍然會
所以你需要的其實是把 serve_forever() 丟到 background thread 裡面
這個其實文件也有提到怎麼做, 請看最後面那個 asynchronous 範例
第二個需求就比較麻煩一點, 因為你必須把收到的資料從背景傳回 GUI thread
這通常會用 queue 來達成 https://docs.python.org/3/library/queue.html
你需要建立一個 queue, 然後在收到資料時丟給它
msg_q = queue.Queue()
class MyTCPRequestHandler(sockerserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
msg_q.put(data)
# 後略
然後在 GUI thread 從這個 queue 裡面拿東西出來
要什麼時候拿就是個學問, 簡單的方法可以用一個 timer 來做
例如 (以下假碼, 請根據你用的 GUI framework 修改)
class MyWindow(gui.Window):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.timer = gui.Timer( # 每 0.1 秒呼叫 self.timeout
timeout=0.1,
callback=self.timeout,
repeat=True,
)
self.timer.start()
def timeout(self):
try: # 試著拿收到的資料出來, 如果沒有就算了
data = msg_q.get_nowait()
except queue.Empty:
pass
else:
# 在這裡把 data 顯示到你要的地方
架構大概是長這樣
剩下的就先試著自行參透吧
--
╱ ̄ ̄ ̄╲
▏◢█◣ ▏
︻█︻█ ▏ 成龍表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1465755520.A.93A.html
※ 編輯: uranusjr (218.161.94.175), 06/13/2016 02:23:47
推
06/13 14:37, , 1F
06/13 14:37, 1F
→
06/13 14:37, , 2F
06/13 14:37, 2F
→
06/13 15:27, , 3F
06/13 15:27, 3F
→
06/13 15:27, , 4F
06/13 15:27, 4F
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章