欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Socket多線程并發(fā)原理及實(shí)現(xiàn)

 更新時(shí)間:2020年12月11日 10:45:29   作者:看雪。  
這篇文章主要介紹了Python Socket多線程并發(fā)原理及實(shí)現(xiàn),幫助大家更好的理解和使用python,感興趣的朋友可以了解下

1.SocketServer模塊編寫的TCP服務(wù)器端代碼

 Socketserver原理圖

服務(wù)端:

import SocketServer      #導(dǎo)入SocketServer,多線程并發(fā)由此類實(shí)現(xiàn)
 
class MySockServer(SocketServer.BaseRequestHandler):  #定義一個(gè)類
 
  def handle(self):   #handle(self)方法是必須要定義的,可以看上面的說明
    print 'Got a new connection from', self.client_address
    while True:
      data = self.request.recv(1024)  #需要通過self的方法調(diào)用數(shù)據(jù)接收函數(shù)
      if not data:break
      print 'recv:', data
 
      self.request.send(data.upper())  #需要通過self的方法調(diào)用數(shù)據(jù)接收函數(shù)
 
if __name__ == '__main__':  #并非一定要用這樣的方式,只是建議這樣使用
  HOST = ''       #定義偵聽本地地址口(多個(gè)IP地址情況下),這里表示偵聽所有
  PORT = 50007     #Server端開放的服務(wù)端口
  s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
               #調(diào)用SocketServer模塊的多線程并發(fā)函數(shù)
  s.serve_forever()   #持續(xù)接受客戶端的連接

客戶端:

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的實(shí)現(xiàn)的FTP程序

 服務(wù)端:

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多線程并發(fā)原理及實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Python Socket多線程并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章搞懂Python的類與對(duì)象名稱空間

    一篇文章搞懂Python的類與對(duì)象名稱空間

    這篇文章主要給大家介紹了關(guān)于Python的類與對(duì)象名稱空間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python 元類實(shí)例解析

    Python 元類實(shí)例解析

    這篇文章主要介紹了 Python 元類實(shí)例解析,此文的主要任務(wù)就是給大家徹底講明白什么是元類,需要的朋友可以參考下
    2018-04-04
  • python字典進(jìn)行運(yùn)算原理及實(shí)例分享

    python字典進(jìn)行運(yùn)算原理及實(shí)例分享

    在本篇文章里小編給大家整理的是一篇關(guān)于python字典進(jìn)行運(yùn)算原理及實(shí)例分享內(nèi)容,有需要的朋友們可以測(cè)試下。
    2021-08-08
  • Python中字典映射類型的學(xué)習(xí)教程

    Python中字典映射類型的學(xué)習(xí)教程

    這篇文章主要介紹了Python中字典映射類型的學(xué)習(xí)教程,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 使用Python進(jìn)行體育競技分析(預(yù)測(cè)球隊(duì)成績)

    使用Python進(jìn)行體育競技分析(預(yù)測(cè)球隊(duì)成績)

    這篇文章主要介紹了用Python進(jìn)行體育競技分析(預(yù)測(cè)球隊(duì)成績),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • python 搭建簡單的http server,可直接post文件的實(shí)例

    python 搭建簡單的http server,可直接post文件的實(shí)例

    今天小編就為大家分享一篇python 搭建簡單的http server,可直接post文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python編寫猜數(shù)字小游戲

    python編寫猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了python編寫猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python 垃圾收集機(jī)制的實(shí)例詳解

    python 垃圾收集機(jī)制的實(shí)例詳解

    這篇文章主要介紹了 python 垃圾收集機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Python為什么要保留顯式的self

    Python為什么要保留顯式的self

    本文主要介紹了Python為什么要保留顯式的self,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python3如何實(shí)現(xiàn)列表模糊匹配列表

    Python3如何實(shí)現(xiàn)列表模糊匹配列表

    這篇文章主要介紹了Python3如何實(shí)現(xiàn)列表模糊匹配列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論