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 相关文章推荐
PyQt 线程类 QThread使用详解
Jul 16 Python
python中numpy.zeros(np.zeros)的使用方法
Nov 07 Python
python版微信跳一跳游戏辅助
Jan 11 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
Python中如何导入类示例详解
Apr 17 Python
python腾讯语音合成实现过程解析
Aug 01 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
Pytorch to(device)用法
Jan 08 Python
Python threading.local代码实例及原理解析
Mar 16 Python
python regex库实例用法总结
Jan 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
php win下Socket方式发邮件类
2009/08/21 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
php简单中奖算法(实例)
2017/08/15 PHP
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中的字典与成员运算符初步探究
2015/10/13 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
python 对象和json互相转换方法
2018/03/22 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
简单的Python调度器Schedule详解
2019/08/30 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
Jar包的作用是什么
2014/03/30 面试题
给老师的道歉信
2014/01/11 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
施工员岗位职责
2015/02/10 职场文书
工作自我评价范文
2015/03/05 职场文书
小学六一主持词开场白
2015/05/28 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL