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爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python实现批量按比例缩放图片效果
Mar 30 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
python 数据提取及拆分的实现代码
Aug 26 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python requests模块cookie实例解析
Apr 14 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
python如何停止递归
Sep 09 Python
pandas实现导出数据的四种方式
Dec 13 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
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
微信小程序实现点击图片放大预览
2019/10/21 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
python win32 简单操作方法
2017/05/25 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
业务主管岗位职责
2013/11/20 职场文书
新学期班主任寄语
2014/01/18 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
读书月活动方案
2014/05/22 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
工作求职信
2014/07/04 职场文书
社团招新宣传语
2015/07/13 职场文书
Python图片检索之以图搜图
2021/05/31 Python
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL