您的位置:首页 > 编程语言 > Python开发

python socket多线程

2016-01-02 21:56 721 查看

上节一个服务器只能连接一个客户端,要想一个服务器连接多个客户端就需要运用多线程来实现,每来一个连接就创建一个线程来和此客户端进行对话,这样就能实现并发,而非客户端等待。

一、原理:

SocketServer类帮我们实现了多线程,不必自己去创建线程,结束线程。它所做的就是客户端请求连接,服务器就从线程池中取出一个线程,和客户端进行通信,然后把它放入连接池中,这就表明该线程目前正在被使用。客户端断开连接后,线程又被线程池回收。这对用户来说都是透明的,不必去关心。线程池中线程数量多少,这个就要看服务器性能高低了。



二、实现:

服务器端:
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
<span style="white-space:pre">	</span>def handle(self):
<span style="white-space:pre">		</span>while 1:
<span style="white-space:pre">			</span>self.data = self.request.recv(1024).strip()
<span style="white-space:pre">			</span>print "{} wrote:".format(self.client_address[0])
<span style="white-space:pre">			</span>if not self.data:
<span style="white-space:pre">				</span>print "client %s is dead!" % self.client_address[0]
<span style="white-space:pre">				</span>break
<span style="white-space:pre">			</span>self.request.sendall(self.data.upper())

if  __name__ == "__main__":
<span style="white-space:pre">	</span>host, port = "localhost", 20001
<span style="white-space:pre">	</span>server = SocketServer.ThreadingTCPServer((host, port), MyTCPHandler)
<span style="white-space:pre">	</span>server.serve_forever()
有几点要说明:

1、使用多线程socket需包含SocketServer类

2、我们创建一个类去处理客户端发来的请求时,创建的类必须继承SocketServer.BaseRequestHandler基类

3、创建的类必须实现handle方法

4、if  __name__ == "__main__"这句表示如果是直接运行就执行下面代码,否则(模块导入)不执行。
客户端:
<span style="font-size:24px;">import socket
import os, time
host = '127.0.0.1'
port = 20001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

while 1:
cmd = raw_input('your command:').strip()
s.sendall(cmd)
data = s.recv(1024)
print data
s.close()
os.system('pause')</span>

运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: