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读取二进制文件的实例讲解
Jul 09 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
Python多项式回归的实现方法
Mar 11 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
python分布式计算dispy的使用详解
Dec 22 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
适合Python初学者的一些编程技巧
Feb 12 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
Python实现我的世界小游戏源代码
Mar 02 Python
如何解决.cuda()加载用时很长的问题
May 24 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
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php模拟post提交数据的方法
2015/02/12 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
微信小程序webSocket的使用方法
2020/02/20 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
浅谈Python处理PDF的方法
2017/11/10 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Keras 使用 Lambda层详解
2020/06/10 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
会走路的树教学反思
2014/02/20 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
司机岗位职责说明书
2014/07/29 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python