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学习RabbitMQ消息队列
Nov 30 Python
python使用tkinter实现简单计算器
Jan 30 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
tensorflow自定义激活函数实例
Feb 04 Python
基于python实现获取网页图片过程解析
May 11 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 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
关于crontab的使用详解
2013/06/24 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python numpy格式化打印的实例
2018/05/14 Python
使用TensorFlow实现SVM
2018/09/06 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
python 画图 图例自由定义方式
2020/04/17 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
应用化学专业职业生涯规划书
2013/12/31 职场文书
上班早退检讨书
2014/01/09 职场文书
redis protocol通信协议及使用详解
2022/07/15 Redis