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创建微信聊天机器人
Mar 31 Python
python使用PIL模块获取图片像素点的方法
Jan 08 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
python config文件的读写操作示例
Sep 27 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
django ajax发送post请求的两种方法
Jan 05 Python
python中的itertools的使用详解
Jan 13 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
Django DRF路由与扩展功能的实现
Jun 03 Python
Python StringIO及BytesIO包使用方法解析
Jun 15 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 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+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
小程序实现多列选择器
2019/02/15 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python中List.index()方法的使用教程
2015/05/20 Python
图文详解WinPE下安装Python
2016/05/17 Python
python实现多线程的两种方式
2016/05/22 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
美术指导求职信
2014/03/17 职场文书
社会实践活动总结报告
2014/04/29 职场文书
师德师风承诺书
2014/05/23 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
解除劳动合同协议书
2014/09/17 职场文书
房屋质量投诉书
2015/07/02 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL