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 相关文章推荐
django admin 后台实现三级联动的示例代码
Jun 22 Python
基于python实现简单日历
Jul 28 Python
对python调用RPC接口的实例详解
Jan 03 Python
pandas计算最大连续间隔的方法
Jul 04 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
Python的互斥锁与信号量详解
Sep 12 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
python实现梯度下降和逻辑回归
Mar 24 Python
解决python3输入的坑——input()
Dec 05 Python
详解python 条件语句和while循环的实例代码
Dec 28 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 Python
简单介绍Python的第三方库yaml
Jun 18 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
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
python strip()函数 介绍
2013/05/24 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
PyQt5实现拖放功能
2018/04/25 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
一套英文Java笔试题面试题
2016/04/21 面试题
高二历史教学反思
2014/01/25 职场文书
大学生评语大全
2014/04/18 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
社区宣传标语口号
2015/12/26 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS