2012-07-28 452 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