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网络爬虫采集联想词示例
Feb 11 Python
使用Python开发windows GUI程序入门实例
Oct 23 Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
python删除列表内容
Aug 04 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
利用Python实现网络测试的脚本分享
May 26 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
对numpy中轴与维度的理解
Apr 18 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
python Xpath语法的使用
Nov 26 Python
90行Python代码开发个人云盘应用
Apr 20 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高效率写法(详解原因)
2013/06/20 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
师德演讲稿范文
2014/05/06 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
作息时间调整通知
2015/04/22 职场文书
开展警示教育活动总结
2015/05/09 职场文书
党员身份证明材料
2015/06/19 职场文书
创业计划书之花店
2019/09/20 职场文书
导游词之山东孔庙
2019/11/04 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
Redis命令处理过程源码解析
2022/02/12 Redis
再谈python_tkinter弹出对话框创建
2022/03/20 Python
JavaScript设计模式之原型模式详情
2022/06/21 Javascript