Python Socket多线程并发原理及实现


Posted in Python onDecember 11, 2020

1.SocketServer模块编写的TCP服务器端代码

 Socketserver原理图

Python Socket多线程并发原理及实现

服务端:

import SocketServer      #导入SocketServer,多线程并发由此类实现
 
class MySockServer(SocketServer.BaseRequestHandler):  #定义一个类
 
  def handle(self):   #handle(self)方法是必须要定义的,可以看上面的说明
    print 'Got a new connection from', self.client_address
    while True:
      data = self.request.recv(1024)  #需要通过self的方法调用数据接收函数
      if not data:break
      print 'recv:', data
 
      self.request.send(data.upper())  #需要通过self的方法调用数据接收函数
 
if __name__ == '__main__':  #并非一定要用这样的方式,只是建议这样使用
  HOST = ''       #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有
  PORT = 50007     #Server端开放的服务端口
  s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
               #调用SocketServer模块的多线程并发函数
  s.serve_forever()   #持续接受客户端的连接

客户端:

import socket
 
HOST = '192.168.1.13'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
 
while True:
  user_input = raw_input('msg to send:').strip()
  s.sendall(user_input)
  data = s.recv(1024)
  print 'Received', repr(data)
 
s.close()

 2.基于Python Socketserver的实现的FTP程序

 服务端:

import socketserver
import struct
import json
import os
class FtpServer(socketserver.BaseRequestHandler):
  coding='utf-8'
  server_dir='file_upload'
  max_packet_size=1024
  BASE_DIR=os.path.dirname(os.path.abspath(__file__))
  def handle(self):
    print(self.request)
    while True:
      data=self.request.recv(4)
      data_len=struct.unpack('i',data)[0]
      head_json=self.request.recv(data_len).decode(self.coding)
      head_dic=json.loads(head_json)
      # print(head_dic)
      cmd=head_dic['cmd']
      if hasattr(self,cmd):
        func=getattr(self,cmd)
        func(head_dic)
  def put(self,args):
    file_path = os.path.normpath(os.path.join(
      self.BASE_DIR,
      self.server_dir,
      args['filename']
    ))

    filesize = args['filesize']
    recv_size = 0
    print('----->', file_path)
    with open(file_path, 'wb') as f:
      while recv_size < filesize:
        recv_data = self.request.recv(self.max_packet_size)
        f.write(recv_data)
        recv_size += len(recv_data)
        print('recvsize:%s filesize:%s' % (recv_size, filesize))


ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()

 客户端:

import socket
import struct
import json
import os



class MYTCPClient:
  address_family = socket.AF_INET

  socket_type = socket.SOCK_STREAM

  allow_reuse_address = False

  max_packet_size = 8192

  coding='utf-8'

  request_queue_size = 5

  def __init__(self, server_address, connect=True):
    self.server_address=server_address
    self.socket = socket.socket(self.address_family,
                  self.socket_type)
    if connect:
      try:
        self.client_connect()
      except:
        self.client_close()
        raise

  def client_connect(self):
    self.socket.connect(self.server_address)

  def client_close(self):
    self.socket.close()

  def run(self):
    while True:
      inp=input(">>: ").strip()
      if not inp:continue
      l=inp.split()
      cmd=l[0]
      if hasattr(self,cmd):
        func=getattr(self,cmd)
        func(l)


  def put(self,args):
    cmd=args[0]
    filename=args[1]
    if not os.path.isfile(filename):
      print('file:%s is not exists' %filename)
      return
    else:
      filesize=os.path.getsize(filename)

    head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
    print(head_dic)
    head_json=json.dumps(head_dic)
    head_json_bytes=bytes(head_json,encoding=self.coding)

    head_struct=struct.pack('i',len(head_json_bytes))
    self.socket.send(head_struct)
    self.socket.send(head_json_bytes)
    send_size=0
    with open(filename,'rb') as f:
      for line in f:
        self.socket.send(line)
        send_size+=len(line)
        print(send_size)
      else:
        print('upload successful')




client=MYTCPClient(('127.0.0.1',8080))

client.run()

以上就是Python Socket多线程并发原理及实现的详细内容,更多关于Python Socket多线程并发的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python自动重试HTTP连接装饰器
Apr 28 Python
Python+微信接口实现运维报警
Aug 27 Python
书单|人生苦短,你还不用python!
Dec 29 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
通过Pandas读取大文件的实例
Jun 07 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
Oct 31 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
Python tkinter常用操作代码实例
Jan 03 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
python pip如何手动安装二进制包
Sep 30 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
python 实现Harris角点检测算法
Dec 11 #Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 #Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 #Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 #Python
Python 用__new__方法实现单例的操作
Dec 11 #Python
python实现图像高斯金字塔的示例代码
Dec 11 #Python
Pycharm plot独立窗口显示的操作
Dec 11 #Python
You might like
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
微信小程序文章详情页面实现代码
2018/09/10 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
Python跳出循环语句continue与break的区别
2014/08/25 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
详解Python中用于计算指数的exp()方法
2015/05/14 Python
python常见的格式化输出小结
2016/12/15 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python3爬虫学习入门教程
2018/12/11 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python递归函数用法详解
2020/10/26 Python
Flask处理Web表单的实现方法
2021/01/31 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
银行出纳岗位职责
2013/11/25 职场文书
初中生自我评价
2014/02/01 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
课程设计的心得体会
2014/09/03 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript