python多线程socket编程--多

发布时间:2019-07-24 09:54:13编辑:auto阅读(1230)

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

    1、客户端

    #!/usr/bin/env python
    #coding:utf-8
    '''
    file:client.py
    date:9/9/17 3:43 PM
    author:lockey
    email:lockey@123.com
    desc:socket编程客户端,python3.6.2
    '''
    import socket,sys
    HOST = '192.168.1.6'
    PORT = 8998
    ADDR =(HOST,PORT)
    BUFSIZE = 1024
    
    sock = 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()
            break
    except Exception:
        print('error')
        sock.close()
        sys.exit()
    

    2、SocketServer模块

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

    #!/usr/bin/env python
    #coding:utf-8
    '''
    file:client.py
    date:9/9/17 3:43 PM
    author:lockey
    email:lockey@123.com
    desc:socket编程服务器端,python3.6.2
    '''
    from socketserver import BaseRequestHandler,ThreadingTCPServer
    import threading
    
    BUF_SIZE=1024
    
    class 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')
                    break
    
    if __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)

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

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

    有任何问题可以留言讨论

关键字