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程序与系统shell交互的方式
Apr 09 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
Python内置random模块生成随机数的方法
May 31 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
python自动识别文本编码格式代码
Dec 26 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 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开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python中logging模块的用法实例
2014/09/29 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
python实现飞机大战微信小游戏
2020/03/21 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
妇女干部培训方案
2014/05/12 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
个人买房协议书范本
2014/10/06 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
安全隐患整改报告
2014/11/06 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
Python简易开发之制作计算器
2022/04/28 Python