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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
Python下载懒人图库JavaScript特效
May 28 Python
python解决网站的反爬虫策略总结
Oct 26 Python
分析python切片原理和方法
Dec 19 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
python中kmeans聚类实现代码
Feb 23 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
详解Python设计模式之策略模式
Jun 15 Python
浅析Python 字符编码与文件处理
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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
漂亮但不安全的CTB
2006/10/09 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php分页示例分享
2014/04/30 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP7常量数组用法分析
2016/09/26 PHP
如何在PHP中生成随机数
2020/06/04 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
python实现用户管理系统
2018/01/10 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
基于python监控程序是否关闭
2020/01/14 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
大学生简单自荐信
2013/11/10 职场文书
投标保密承诺书
2014/05/19 职场文书
2014年财政所工作总结
2014/11/22 职场文书