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 相关文章推荐
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
Python计算三角函数之asin()方法的使用
May 15 Python
python计算时间差的方法
May 20 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
用python实现的线程池实例代码
Jan 06 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
Python对切片命名的实现方法
Oct 16 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 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设计模式 Decorator(装饰模式)
2011/06/26 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
2017/07/17 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
python中常用的九种预处理方法分享
2016/09/11 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
面料业务员岗位职责
2013/12/26 职场文书
自我鉴定总结
2014/03/24 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
Java Redisson多策略注解限流
2022/09/23 Java/Android