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 相关文章推荐
Python3里的super()和__class__使用介绍
Apr 23 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
Python3学习urllib的使用方法示例
Nov 29 Python
Python决策树分类算法学习
Dec 22 Python
Python实现的生成格雷码功能示例
Jan 24 Python
python unittest实现api自动化测试
Apr 04 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
python保存字典和读取字典的实例代码
Jul 07 Python
python3 map函数和filter函数详解
Aug 26 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实现抓取HTTPS内容
2014/12/01 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP微信API接口类
2016/08/22 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
popdiv
2006/07/14 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
Python高效编程技巧
2013/01/07 Python
Python列表推导式的使用方法
2013/11/21 Python
python 多进程通信模块的简单实现
2014/02/20 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
通过Python实现一个简单的html页面
2020/05/16 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
停车位租赁协议书
2014/09/24 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
golang判断key是否在map中的代码
2021/04/24 Golang
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js