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中使用PIPE操作Linux管道
Feb 04 Python
最基础的Python的socket编程入门教程
Apr 23 Python
python实现发送和获取手机短信验证码
Jan 15 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
python操作excel的方法
Aug 16 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
python对常见数据类型的遍历解析
Aug 27 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 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 在文件指定行插入数据的代码
2010/05/08 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
JS中的三个循环小结
2017/06/20 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
在vue项目中引用Iview的方法
2018/09/14 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python多进程实现进程间通信实例
2017/11/24 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
类如何去实现接口
2013/12/19 面试题
const和static readonly区别
2013/05/20 面试题
办公室助理岗位职责
2013/12/25 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
企业管理标语
2014/06/10 职场文书
小学生读书活动总结
2014/06/30 职场文书
2014年安全生产责任书
2014/07/22 职场文书
留学推荐信英文范文
2015/03/26 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL