Python TCPServer 多线程多客户端通信的实现


Posted in Python onDecember 31, 2019

最简单、原始的TCP通信demo

服务端Http请求:

import socket

# 创建一个servicesocke
serviceSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 给服务器绑定地址(ip地址,端口号)
serviceSocket.bind(("192.168.171.1", 80))

print("等待客户端接入")
# sock 是客户端的socket信息
# addr 是客户端的地址(ip,端口)
sock, addr = serviceSocket.accept()
print(f"sock from client:{sock}")
print(f"addr of client:{addr}")

while True:
  # 接收客户端的请求
  recvData = sock.recv(1024)
  print("客户端说:%s" % (recvData.decode("utf-8")))
  sendData = input("服务器说:")
  # 发送(回复)数据给客户端
  sock.send(sendData.encode("utf-8"))

客户端Http请求:

import socket

# 创建客户端socket
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器
clientSocket.connect(("192.168.171.1", 80))

while True:
  # 发送消息给服务器
  sendData = input("客户端说:")
  if sendData == "bye":
    clientSocket.send(sendData.encode("utf-8")) # 编码:将数据装换成二进制形式
    break
  clientSocket.send(sendData.encode("utf-8"))
  recvData = clientSocket.recv(1024)
  print("服务器说:%s" % (recvData.decode("utf-8"))) # 解码:将二进制转换成字符

1、在TCP中,客户端的实现流程:

创建客户端的socket对象建立与服务器之间的联系发送请求接收数据关闭连接

2、服务端的实现流程:

创建服务端的socket对象绑定服务端的地址设置监听器等待客户端的连接接收客户端的请求返回处理的结果到客户端

ThreadingTCPServer 多线程多客户端通信自动重连demo

socketserver继承图:

Python TCPServer 多线程多客户端通信的实现

TCPServer

# from socketserver import TCPServer, BaseRequestHandler, ThreadingTCPServer
from socketserver import TCPServer, StreamRequestHandler, ThreadingMixIn
import traceback

# class MyBaseRequestHandler(BaseRequestHandler):
class MyBaseRequestHandler(StreamRequestHandler):

  def handle(self):
    self.addr = self.request.getpeername()
    self.server.users[self.addr[1]] = self.request
    message = "IP " + self.addr[0] + ":" + str(self.addr[1]) + " Connected..."
    print(message)

    while True:
      try:
        data = self.request.recv(1024).decode('UTF-8', 'ignore').strip()
        print(f'receive from {self.client_address}:{data}')

        back_data = (f"response\"" + data + "\":\n").encode("utf8")
        self.request.sendall(back_data)
      except:
        traceback.print_exc()
        break

# 源码:class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
# 从ThreadingMixIn和TCPServer继承,实现多线程
class MyThreadingTCPServer(ThreadingMixIn, TCPServer):
  def __init__(self, server_address, RequestHandlerClass):
    TCPServer.__init__(self, server_address, RequestHandlerClass)
    self.users = {}


class MyTCPserver():
  def __init__(self, server_addr='192.168.1.109', server_port=23):
    self.server_address = server_addr
    self.server_port = server_port
    self.server_tuple = (self.server_address, self.server_port)

  def run(self):
    # server = TCPServer(self.server_tuple, MyBaseRequestHandler)
    server = MyThreadingTCPServer(self.server_tuple, MyBaseRequestHandler)
    server.serve_forever()


if __name__ == '__main__':
  myserver = MyTCPserver()
  myserver.run()

在telnet 下开启开启两个客户端,本电脑的IP为192.168.1.109,开两个客户端后,TCPServer的终端出现同一个IP但是不同端口的连接:

Python TCPServer 多线程多客户端通信的实现

TCPClient

import socket
import time

class MyClient:
  host = '192.168.1.109'
  port = 23
  bufsiz = 1024
  addr = None
  skt = None

  def __init__(self, host=None, port=None):
    if host != None:
      self.host = host

    if port != None:
      self.port = port

    if self.addr == None:
      self.addr = (self.host, self.port)

    self.doConnection()

  def doConnection(self):
    try:
      self.skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      self.skt.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
      print(self.addr)
      self.skt.connect(self.addr)
    except:
      pass

  def run(self):
    while True:
      try:
        _time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self.skt.sendall(f'{_time}:i am clent1 '.encode('utf-8'))
        data = self.skt.recv(self.bufsiz)
        print(data.decode('utf-8', 'ignore'))
        if not data:
          break
        print(data.strip())
        time.sleep(5)
      except socket.error:
        print('socket error, reconnection') # 自动重连
        time.sleep(3)
        self.doConnection()
      except:
        print('other error')

    self.skt.close()


myclient = MyClient()
myclient.run()

上面用的是telnet工具来作为客户端,这里是用代码实现模拟的客户端。

Python TCPServer 多线程多客户端通信的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
python中self原理实例分析
Apr 30 Python
深入理解Python装饰器
Jul 27 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
使用python制作一个解压缩软件
Nov 13 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python基础教程之输入输出和运算符
Jul 26 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Python实现区域填充的示例代码
Feb 03 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 #Python
Python面向对象封装操作案例详解
Dec 31 #Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 #Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 #Python
Pycharm最新激活码2019(推荐)
Dec 31 #Python
python ftplib模块使用代码实例
Dec 31 #Python
深入了解如何基于Python读写Kafka
Dec 31 #Python
You might like
php模板之Phpbean的目录结构
2008/01/10 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
js压缩利器
2007/02/20 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
python实现控制台输出颜色
2021/03/02 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
研究生导师评语
2014/12/31 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
监守自盗观后感
2015/06/10 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python