最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

 Socketserver原理圖

服務(wù)端:

import SocketServer      #導(dǎo)入SocketServer,多線程并發(fā)由此類(lèi)實(shí)現(xiàn)
 
class MySockServer(SocketServer.BaseRequestHandler):  #定義一個(gè)類(lèi)
 
  def handle(self):   #handle(self)方法是必須要定義的,可以看上面的說(shuō)明
    print 'Got a new connection from', self.client_address
    while True:
      data = self.request.recv(1024)  #需要通過(guò)self的方法調(diào)用數(shù)據(jù)接收函數(shù)
      if not data:break
      print 'recv:', data
 
      self.request.send(data.upper())  #需要通過(guò)self的方法調(diào)用數(shù)據(jù)接收函數(shù)
 
if __name__ == '__main__':  #并非一定要用這樣的方式,只是建議這樣使用
  HOST = ''       #定義偵聽(tīng)本地地址口(多個(gè)IP地址情況下),這里表示偵聽(tīng)所有
  PORT = 50007     #Server端開(kāi)放的服務(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之進(jìn)行URL編碼案例講解

    Python之進(jìn)行URL編碼案例講解

    這篇文章主要介紹了Python之進(jìn)行URL編碼案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • python判斷變量是否為列表的方法

    python判斷變量是否為列表的方法

    在本篇文章里小編給大家整理了關(guān)于python判斷變量是否為列表的方法,有需要的朋友們可以學(xué)習(xí)下。
    2020-09-09
  • python list格式數(shù)據(jù)excel導(dǎo)出方法

    python list格式數(shù)據(jù)excel導(dǎo)出方法

    今天小編就為大家分享一篇python list格式數(shù)據(jù)excel導(dǎo)出方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • python中mediapipe庫(kù)踩過(guò)的坑實(shí)戰(zhàn)記錄

    python中mediapipe庫(kù)踩過(guò)的坑實(shí)戰(zhàn)記錄

    MediaPipe是由google制作的開(kāi)源的、跨平臺(tái)的機(jī)器學(xué)習(xí)框架,可以將一些模型部署到不同的平臺(tái)和設(shè)備上使用的同時(shí),也能保住檢測(cè)速度,下面這篇文章主要給大家介紹了關(guān)于python中mediapipe庫(kù)踩過(guò)的坑的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Python繪制全球疫情變化地圖的實(shí)例代碼

    Python繪制全球疫情變化地圖的實(shí)例代碼

    這篇文章主要介紹了使用Python繪制全球疫情變化地圖的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 基于python連接oracle導(dǎo)并出數(shù)據(jù)文件

    基于python連接oracle導(dǎo)并出數(shù)據(jù)文件

    這篇文章主要介紹了基于python連接oracle導(dǎo)并出數(shù)據(jù)文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python如何使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用

    Python如何使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用

    這篇文章主要介紹了Python使用WebSocket實(shí)現(xiàn)實(shí)時(shí)Web應(yīng)用,Django?Channels?提供了強(qiáng)大的功能,使得在?Django?中實(shí)現(xiàn)實(shí)時(shí)功能變得更加容易,你可以在此基礎(chǔ)上擴(kuò)展,添加更多功能和復(fù)雜的邏輯,需要的朋友可以參考下
    2024-08-08
  • 教你利用Python+Turtle繪制簡(jiǎn)易版愛(ài)心表白

    教你利用Python+Turtle繪制簡(jiǎn)易版愛(ài)心表白

    這篇文章主要介紹了教你利用Python+Turtle繪制簡(jiǎn)易版愛(ài)心表白,文中有非常詳細(xì)的代碼示例,對(duì)想要和男朋友或者女朋友表白的小伙伴們有很大幫助喲,需要的朋友可以參考下
    2021-04-04
  • 2020版Python學(xué)習(xí)路線圖(附學(xué)習(xí)資料)

    2020版Python學(xué)習(xí)路線圖(附學(xué)習(xí)資料)

    這篇文章主要介紹了Python學(xué)習(xí)路線圖(2020最新版),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • django中path和url函數(shù)的具體使用

    django中path和url函數(shù)的具體使用

    本文主要介紹了django中path和url函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

灵丘县| 阳谷县| 浙江省| 扎赉特旗| 商丘市| 佛坪县| 贵州省| 迁安市| 宽甸| 浑源县| 黄石市| 景泰县| 犍为县| 凤冈县| 彭阳县| 哈巴河县| 依兰县| 保康县| 保定市| 盐山县| 潞西市| 洛隆县| 鹤山市| 德清县| 新民市| 肥东县| 漠河县| 荥经县| 泰和县| 海原县| 获嘉县| 宣恩县| 稻城县| 鸡泽县| 巴南区| 乌苏市| 洞头县| 双牌县| 伊金霍洛旗| 沾化县| 本溪|