python多线程socket编程--多客户端接入

来源:互联网 发布:苹果cms 仿08影院模板 编辑:程序博客网 时间:2024/06/07 02:50

Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 
端用有很多模块可以使用,如下: 
这里写图片描述

1、客户端

#!/usr/bin/env python#coding:utf-8'''file:client.pydate:9/9/17 3:43 PMauthor:lockeyemail:lockey@123.comdesc:socket编程客户端,python3.6.2'''import socket,sysHOST = '192.168.1.6'PORT = 8998ADDR =(HOST,PORT)BUFSIZE = 1024sock = socket.socket()try:    sock.connect(ADDR)    print('have connected with server')    while True:      data = input('lockey# ')      if len(data)>0:        print('send:',data)        sock.sendall(data.encode('utf-8')) #不要用send()        recv_data = sock.recv(BUFSIZE)        print('receive:',recv_data.decode('utf-8'))      else:        sock.close()        breakexcept Exception:    print('error')    sock.close()    sys.exit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

2、SocketServer模块

为了能够让多个客户端同时接入服务并进行通信,服务端将使用SocketServer模块来实现,这样的话用户不用在子线程结束后,利用父进程对它进行处理,也不用关心socket的关闭,一切都由SocketServer来完成。

#!/usr/bin/env python#coding:utf-8'''file:client.pydate:9/9/17 3:43 PMauthor:lockeyemail:lockey@123.comdesc:socket编程服务器端,python3.6.2'''from socketserver import BaseRequestHandler,ThreadingTCPServerimport threadingBUF_SIZE=1024class Handler(BaseRequestHandler):    def handle(self):        address,pid = self.client_address        print('%s connected!'%address)        while True:            data = self.request.recv(BUF_SIZE)            if len(data)>0:                print('receive=',data.decode('utf-8'))                cur_thread = threading.current_thread()                #response = '{}:{}'.format(cur_thread.ident,data)                self.request.sendall('response'.encode('utf-8'))                print('send:','response')            else:                print('close')                breakif __name__ == '__main__':    HOST = '192.168.1.6'    PORT = 8998    ADDR = (HOST,PORT)    server = ThreadingTCPServer(ADDR,Handler)  #参数为监听地址和已建立连接的处理类    print('listening')    server.serve_forever()  #监听,建立好TCP连接后,为该连接创建新的socket和线程,并由处理类中的handle方法处理    print(server)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

以下测试中我使用另外一台主机和本机的两个中断去连接服务器,都可以正常连接并且能进行数据应答交互 
这里写图片描述

注意:此程序示例运行平台为rhel7.2.x86_64,python版本为3.6.2,对于windows平台和非同一python版本的用户可能缺乏一定的兼容性,如果是其他平台用户请自行修正!!

原创粉丝点击