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设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
Django打印出在数据库中执行的语句问题
Jul 25 Python
Python小白不正确的使用类变量实例
May 29 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
python归并排序算法过程实例讲解
Nov 04 Python
pandas抽取行列数据的几种方法
Dec 13 Python
python 下划线的多种应用场景总结
May 12 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多态的实现详解
2013/06/09 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
js实现简单点赞操作
2020/03/17 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
手把手教你python实现SVM算法
2017/12/27 Python
Django框架多表查询实例分析
2018/07/04 Python
详解用python写一个抽奖程序
2019/05/10 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
百度吧主申请感言
2014/01/12 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
开学典礼演讲稿
2014/05/23 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
Python3 类型标注支持操作
2021/06/02 Python