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 uuid模块使用实例
Apr 08 Python
Python 26进制计算实现方法
May 28 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
numpy下的flatten()函数用法详解
May 27 Python
Python如何实现转换URL详解
Jul 02 Python
python opencv实现证件照换底功能
Aug 19 Python
Python中url标签使用知识点总结
Jan 16 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 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文件上传实例详解!!!
2007/01/02 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
AJAX的使用方法详解
2017/04/29 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
python调用新浪微博API项目实践
2014/07/28 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
如何用python处理excel表格
2020/06/09 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
体育部部长竞选稿
2015/11/21 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis