首页 > 编程 > Python > 正文

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

2020-01-04 16:44:10
字体:
来源:转载
供稿:网友

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

python,多线程,socket

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()


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)

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

python,多线程,socket

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表