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 相关文章推荐
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
使用Python进行目录的对比方法
Nov 01 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
pandas数据处理之绘图的实现
Jun 15 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
python 实现弹球游戏的示例代码
Nov 17 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的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
python文件操作整理汇总
2014/10/21 Python
Python对List中的元素排序的方法
2018/04/01 Python
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
应用化学专业职业生涯规划书
2013/12/31 职场文书
给护士表扬信
2014/01/19 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
《将心比心》教学反思
2016/02/23 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
导游词之桂林山水
2019/09/20 职场文书
Python实现简繁体转换
2021/06/07 Python