python socket多线程

来源:互联网 发布:手机淘宝怎么获得积分 编辑:程序博客网 时间:2024/05/17 09:15

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

一、原理:

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

二、实现:

  1. 服务器端:
    import SocketServerclass 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__"这句表示如果是直接运行就执行下面代码,否则(模块导入)不执行。
  2. 客户端:
    <span style="font-size:24px;">import socketimport os, timehost = '127.0.0.1'port = 20001s = 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 datas.close()os.system('pause')</span>
  3. 运行结果:


0 0
原创粉丝点击