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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python服务器端收发请求的实现代码
Sep 29 Python
python中偏函数partial用法实例分析
Jul 08 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
如何在python中实现随机选择
Nov 02 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 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中$this-&amp;gt;含义分析
2009/11/29 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
vue项目中引入Sass实例方法
2019/08/27 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
python每隔N秒运行指定函数的方法
2015/03/16 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python利用platform模块获取系统信息
2020/10/09 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
三项教育活动实施方案
2014/03/30 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
群众路线专项整治方案
2014/10/27 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
小学英语听课心得体会
2016/01/14 职场文书
导游词之临安白水涧
2019/11/05 职场文书