python - 如何在同一 .py 中但在不同端口上对客户端和服务器进行多线程处理

标签 python multithreading sockets chat python-multithreading

我想用Python制作一个聊天程序,这样我就可以发送和接收数据。
我想我可以运行多个线程,客户端和服务器各一个。
我的问题是
如何在一个文件中为两个类运行多个线程?

我当前的代码:

from socket import *
from threading import Thread

class Server(Thread):
    def __init__(self,host,port,user):
        self.port = port
        self.host = host
        self.user = user
        self.bufsize = 1024
        self.addr = (host,port)

        self.socket = socket(AF_INET , SOCK_STREAM)
        self.socket.bind(self.addr)
        Thread.__init__(self)

    def run(self):
        self.socket.listen(5)
        while True:
            print 'Waiting for connection..'
            client, caddr = self.socket.accept()
            print 'Connected To',caddr

            data = client.recv(self.bufsize)
            if not data:
                continue
            print data         


class Client(Thread):
    def __init__(self,host,port,user):
        self.port = port
        self.host = host
        self.user = user
        self.bufsize = 1024
        self.addr = (host,port)

        self.socket = socket(AF_INET , SOCK_STREAM)
        Thread.__init__(self)

    def run(self):
        self.socket.connect(self.addr)
        while True:
            data = raw_input('> ')
            if not data:
                continue
            data = user+' said : '+data
            tcpClient.send(data)

host = ''
p1 = int(raw_input('Enter Port 1 : '))
p2 = int(raw_input('Enter Port 2 : '))
user = raw_input('Enter Your user: ').strip()

client = Client(host,p1,user)
server = Server(host,p2,user)

client.start()
server.start()

我当前的错误消息:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python2.7 For Chintoo\lib\threading.py", line 552, in __bootstrap_inner
    self.run()
  File "C:\Users\karuna\Desktop\Jython\Python\My Modules\Network\Chat.py", line 41, in run
    self.socket.connect(self.addr)
  File "C:\Python2.7 For Chintoo\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10049] The requested address is not valid in its context

最佳答案

线程模块应该正是您所需要的。 http://docs.python.org/2/library/threading.html

from socket import *
from threading import Thread

class Server(Thread):
    def __init__(self,host,port,name):
        Thread.__init__(self)
        self.port = port
        self.host = host
        self.name = name
        self.bufsize = 1024
        self.addr = (host,port)

        self.socket = socket(AF_INET , SOCK_STREAM)
        self.socket.bind(self.addr)

    def run(self):
        self.socket.listen(5)
        while True:
            print 'Waiting for connection..'
            client, caddr = self.socket.accept()
            print 'Connected To',caddr

            data = client.recv(self.bufsize)
            if not data:
                continue
            print data         


class Client(Thread):
    def __init__(self,host,port,name):
        Thread.__init__(self)
        self.port = port
        self.host = host
        self.name = name
        self.bufsize = 1024
        self.addr = (host,port)

        self.socket = socket(AF_INET , SOCK_STREAM)

    def run(self):
        invalid = True
        while invalid:
            try:
                invalid = False
                self.socket.connect(self.addr)
            except:
                invalid = True

        while True:
            data = raw_input('> ')
            if not data:
                continue
            data = name+' said : '+data
            tcpClient.send(data)

host = ''
p1 = int(raw_input('Enter Port 1 : '))
p2 = int(raw_input('Enter Port 2 : '))
name = raw_input('Enter Your Name: ').strip()


server = Server(host,p2,name)
client = Client(host,p1,name)

server.start()
client.start()

server.join()

此外,由于某些原因,您不应该在 python 中使用旧样式类,如果您创建简单的类,至少应该从这样的对象继承

类东西(对象): ....

关于python - 如何在同一 .py 中但在不同端口上对客户端和服务器进行多线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894836/

相关文章:

C# foreach 内的线程安全闭包

java - Log4j2 套接字附加器 "connect java.net.ConnectException: Connection refused: connect"

python - 使用 python unittest 抽象测试用例

python - 如何在一张 map 上绘制多个GeoDataFrame(重叠)?

Python Scrapy : TypeError: to_bytes must receive a unicode, str 或 bytes 对象,得到 int

android - 触摸屏幕时移动 View

multithreading - 如何测试添加到哈希表的线程安全性?

python - PackageNotInstalledError : Package is not installed in prefix

javascript - 如何通过离开页面处理客户端断开的socket.io?

.net - Windows 7 Ultimate x64 上的 System.Net.HttpListener 限制为 1k 并发连接