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

溫馨提示×

溫馨提示×

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

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

python中怎么通過socket發送文件

發布時間:2021-06-15 16:17:11 來源:億速云 閱讀:375 作者:Leah 欄目:開發技術

python中怎么通過socket發送文件,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

目錄結構:

python中怎么通過socket發送文件

client:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket, struct, json
download_dir = r'D:\Python\python_learning\gd\code\part3\02網絡編程\文件傳輸\client\download'
gd_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
gd_client.connect(('127.0.0.1',8123))

while True:

 #1、發命令
  cmd=input('>>: ').strip() #get a.txt
  if not cmd:continue
  gd_client.send(cmd.encode('utf-8'))
  #2、以寫的方式打開一個新文件,接收服務端發來的文件的內容寫入客戶的新文件
  #第一步:先收報頭的長度
  obj=gd_client.recv(4)
  header_size=struct.unpack('i',obj)[0]
  # 第二步:再收報頭
  header_bytes = gd_client.recv(header_size)
  # 第三步:從報頭中解析出對真實數據的描述信息
  header_json = header_bytes.decode('utf-8')
  header_dic = json.loads(header_json)
  '''
  header_dic = {
    'filename': filename, # 1.txt
    'file_size': os.path.getsize(r'%s\%s' % (share_dir, filename)) # 路徑/1.txt
  }  
  '''
  total_size = header_dic['file_size']
  file_name = header_dic['filename']
  # 第四步:接收真實的數據
  with open(r'%s\%s'%(download_dir, file_name),'wb') as f:
    recv_size = 0
    while recv_size < total_size:
      line = gd_client.recv(1024)
      f.write(line)
      recv_size += len(line)
      print('總大小:%s  已下載大小:%s' % (total_size, recv_size))
gd_client.close()

server:

#!/usr/bin/env python
# -*-coding:utf-8 -*-
import socket
import subprocess
import struct
import json
import os
share_dir = r'D:\Python\python_learning\gd\code\part3\02網絡編程\文件傳輸\server\share'
gd_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
gd_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
gd_server.bind(('127.0.0.1', 8123)) # 0-65535: 0-1024給操作系統使用
gd_server.listen(5)
while True:
  conn, client_addr = gd_server.accept()
  while True: # 通信循環
    try:
      # 1、收命令
      res = conn.recv(8096) # b'get 1.txt'
      if not res: break # 適用于linux操作系統
      # 2、解析命令,提取相應命令參數
      cmds = res.decode('utf-8').split() # ['get','1.txt']
      filename = cmds[1]
      # 3、以讀的方式打開文件,讀取文件內容發送給客戶端
      # 第一步:制作固定長度的報頭
      header_dic = {
        'filename': filename, # 1.txt
        'file_size':os.path.getsize(r'%s\%s'%(share_dir, filename)) # 路徑/1.txt
      }
      header_json = json.dumps(header_dic)
      header_bytes = header_json.encode('utf-8')
      # 第二步:先發送報頭的長度
      conn.send(struct.pack('i',len(header_bytes)))
      # 第三步:再發報頭
      conn.send(header_bytes)
      # 第四步:再發送真實的數據
      with open('%s/%s'%(share_dir, filename),'rb') as f:
        for line in f:
          conn.send(line)
    except ConnectionResetError: # 適用于windows操作系統
      break
  conn.close()
gd_server.close()

命令輸入: get 1.txt ,然后即可將 server 端的 share文件內的 1.txt 文件 發送到 client 端的 download文件夾下

圖片、視頻、文字都可以發送,因為傳送的是 二進制文件

原理是:server 端以讀的形式打開文件,client端以寫 的方式打開文件,然后client端把 一條一條的二進制寫入文件后保存即可。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

靖安县| 邮箱| 额济纳旗| 柳河县| 夏津县| 凉城县| 错那县| 尚志市| 罗江县| 涞水县| 如皋市| 左贡县| 拜城县| 新营市| 晋州市| 南投市| 高碑店市| 阿巴嘎旗| 房山区| 白银市| 外汇| 聂荣县| 景德镇市| 监利县| 新和县| 新化县| 宣武区| 尉氏县| 承德县| 郯城县| 额尔古纳市| 边坝县| 沁水县| 桦南县| 田阳县| 灵武市| 宁乡县| 紫金县| 广河县| 杂多县| 铜川市|