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开发编码规范
Sep 08 Python
Python中用altzone()方法处理时区的教程
May 22 Python
Python用for循环实现九九乘法表
May 31 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
python实现顺序表的简单代码
Sep 28 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
Python实现微信翻译机器人的方法
Aug 13 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
详解php中 === 的使用
2016/10/24 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
详解NODEJS的http实现
2018/01/04 NodeJs
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python k-近邻算法实例分享
2014/06/11 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
python打开windows应用程序的实例
2019/06/28 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
结婚纪念日感言
2015/08/01 职场文书