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多线程抓取代理服务器IP地址的示例
Nov 09 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
PyQt5实现下载进度条效果
Apr 19 Python
python学习基础之循环import及import过程
Apr 22 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python配置grpc环境
Jan 01 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
面向对象学习之pygame坦克大战
Sep 11 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 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
Smarty Foreach 使用说明
2010/03/23 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
Js的MessageBox
2006/12/03 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
推荐11个实用Python库
2015/01/23 Python
python 换位密码算法的实例详解
2017/07/19 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
办公室前台岗位职责范本
2013/12/10 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
毕业大学生自荐信
2014/06/17 职场文书
文体活动总结
2015/02/04 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js