如何在同一个.py中使用多线程实现客户端和服务器,但在不同端口上
我想用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
2 个回答
2
你可以使用线程模块,这正是你需要的。你可以在这里查看相关文档: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()
另外,有些原因让你不应该使用旧式的类。如果你要创建一个简单的类,至少要像这样从对象继承:
class Something(object):
....
0
简单来说,就是启动多个线程:
from threading import Thread
class Foo(Thread):
def __init__(self):
Thread.__init__(self)
self.keepRunning = True
def run(self):
while self.keepRunning:
print "running in thread", self
import time
if __name__ == "__main__":
mythread1 = Foo()
mythread2 = Foo()
mythread1.start()
mythread2.start()
time.sleep(10) # and let the 2 threads to their work
mythread1.keepRunning = False
mythread2.keepRunning = False