2012-07-28 73 views
2

所以我正在學習套接字編程,並寫了一個漂亮的小聊天服務器。我遇到的問題是我的客戶端無法同時讀寫。我不太清楚如何設置。Python多線程,同時運行兩個函數

這就是我到目前爲止,我想要read()和write()同時運行(它不是關於同時讀取和寫入 - 它是關於能夠在輸入時接收消息()掛起等待用戶輸入。):

import socket 
import threading 

class Client(threading.Thread): 

    def __init__(self): 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.connect(('127.0.0.1', 1234)) 
     print('Client connected to server') 

     self.readThread = threading.Thread.__init__(self) 
     self.writeThread = threading.Thread.__init__(self) 

    def read(self): 
     data = self.socket.recv(1024) 
     if data: 
      print('Received:', data) 

    def write(self): 
     message = input() 
     self.socket.send(bytes(message, 'utf-8')) 


client = Client() 

while True: 
    #do both 
+0

您將要創建兩個單獨的線程對象來進行讀取和寫入。如果您的套接字實現不是線程安全的,那麼您必須添加一個鎖定原語,或者可能是一個將讀寫請求排入套接字的系統。或者你可以使用兩個插座,一個用於閱讀,一個用於寫作。 – 2012-07-28 02:55:28

+0

感謝您的回覆。 與其同時閱讀和寫作沒有多大關係 - 它是關於在input()掛起等待用戶輸入時能夠接收消息。 想法? – puttputt 2012-07-28 03:25:04

+1

從[docs](http://docs.python.org/library/socket.html#socket-objects)看來,'socket'具有非阻塞模式。線程可能是不必要的。 – 2012-07-28 03:40:03

回答

2

你真的很接近。試試這樣的:

import socket 
import threading 

class Client(threading.Thread): 

    def __init__(self): 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.connect(('127.0.0.1', 1234)) 
     print('Client connected to server') 

     t = threading.Thread(target = self.read) 
     t.daemon = True # helpful if you want it to die automatically 
     t.start() 

     t2 = threading.thread(target = self.write) 
     t2.daemon = True 
     t2.start() 

    def read(self): 
     while True: 
      data = self.socket.recv(1024) 
      if data: 
       print('Received:', data) 

    def write(self): 
     while True: 
      message = input() 
      self.socket.send(bytes(message, 'utf-8')) 


client = Client() 

值得指出的是,如果你是從一個終端讀寫這種方式,你的提示可能會失控。我想盡管你從打印語句開始,但最終會將數據收集到應用程序中的其他容器中。

+0

謝謝!它只用daemon = True運行read()和write()一次,但沒有運行! – puttputt 2012-07-28 04:33:06