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 异常处理实例详解
Mar 12 Python
Python import自定义模块方法
Feb 12 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
利用Python破解斗地主残局详解
Jun 30 Python
Python Web程序部署到Ubuntu服务器上的方法
Feb 22 Python
Python 查找字符在字符串中的位置实例
May 02 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
python opencv 简单阈值算法的实现
Aug 04 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
Python如何使用turtle库绘制图形
Feb 26 Python
Python源码解析之List
May 21 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Flask-WTF表单的使用方法
2019/07/12 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
门卫岗位职责
2013/11/15 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
启动仪式策划方案
2014/06/14 职场文书
三严三实对照检查材料
2014/08/25 职场文书
2014年商场工作总结
2014/11/22 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS