91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用 Socket怎么在Python項目中實現一個多線程并發功能

發布時間:2020-12-11 13:55:06 來源:億速云 閱讀:282 作者:Leah 欄目:開發技術

這篇文章給大家介紹利用 Socket怎么在Python項目中實現一個多線程并發功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1.SocketServer模塊編寫的TCP服務器端代碼

 Socketserver原理圖

利用 Socket怎么在Python項目中實現一個多線程并發功能

服務端:

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()

關于利用 Socket怎么在Python項目中實現一個多線程并發功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕉岭县| 元氏县| 张北县| 青浦区| 绥阳县| 柳林县| 东海县| 邓州市| 阜宁县| 正安县| 阳城县| 崇仁县| 德保县| 海安县| 垦利县| 西平县| 铜梁县| 双流县| 仁怀市| 易门县| 荥经县| 泽库县| 白河县| 顺平县| 理塘县| 皮山县| 门头沟区| 黄大仙区| 伊春市| 长乐市| 泊头市| 雷山县| 中江县| 巴彦淖尔市| 额尔古纳市| 延边| 海丰县| 彭泽县| 互助| 三门峡市| 五台县|