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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
Python中的True,False条件判断实例分析
Jan 12 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
对numpy中轴与维度的理解
Apr 18 Python
python统计中文字符数量的两种方法
Jan 31 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
python基础之文件处理知识总结
May 23 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
python实现学生信息管理系统(面向对象)
Jun 05 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&mysql(一)
2006/10/09 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
python 循环while和for in简单实例
2016/08/16 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python多线程实现同步的四种方式
2017/05/02 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
python如何读取bin文件并下发串口
2019/07/05 Python
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
房屋继承公证书
2014/04/10 职场文书
学校创先争优活动总结
2014/08/28 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
详解python网络进程
2021/06/15 Python
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
使用Java去实现超市会员管理系统
2022/03/18 Java/Android