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

python實(shí)現(xiàn)簡(jiǎn)單的tcp 文件下載

 更新時(shí)間:2020年09月16日 08:25:52   作者:小名叫小明  
這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單的tcp文件下載,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

什么是下載?

首先客戶(hù)端會(huì)問(wèn)服務(wù)器,有沒(méi)有一個(gè)xxx的文件???服務(wù)器開(kāi)始尋找,找到后對(duì)客戶(hù)端說(shuō)有,然后客戶(hù)端在本地新建一個(gè)文件,客戶(hù)端從服務(wù)器收到一點(diǎn)數(shù)據(jù),就寫(xiě)進(jìn)這個(gè)文件中,再收到一點(diǎn)數(shù)據(jù),再寫(xiě)入這個(gè)文件中,只要把所有的接收到的數(shù)據(jù)都寫(xiě)入到這個(gè)文件中,就完成了下載的操作。

所以下載需要2個(gè)部分。服務(wù)器的發(fā)送方和客戶(hù)端的接收方。

我們這里不考慮復(fù)雜的情況。什么限速啊,驗(yàn)證啊,文件大小......只實(shí)現(xiàn)最簡(jiǎn)單的邏輯。

客戶(hù)端參考代碼

import socket

def main():

  # 創(chuàng)建socket
  tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # 目的信息
  server_ip = input("請(qǐng)輸入服務(wù)器ip:")
  server_port = int(input("請(qǐng)輸入服務(wù)器port:"))

  # 鏈接服務(wù)器
  tcp_client_socket.connect((server_ip, server_port))

  # 輸入需要下載的文件名
  file_name = input("請(qǐng)輸入要下載的文件名:")

  # 發(fā)送文件下載請(qǐng)求
  tcp_client_socket.send(file_name.encode("utf-8"))

  # 接收對(duì)方發(fā)送過(guò)來(lái)的數(shù)據(jù),最大接收1024個(gè)字節(jié)(1K)
  recv_data = tcp_client_socket.recv(1024)
  # 如果接收到數(shù)據(jù)再創(chuàng)建文件,否則不創(chuàng)建
  if recv_data:
    with open("[接收]"+file_name, "wb") as f:
      f.write(recv_data)

  # 關(guān)閉套接字
  tcp_client_socket.close()


if __name__ == "__main__":
  main()

服務(wù)端參考代碼

import socket
import sys


def get_file_content(file_name):
  """獲取文件的內(nèi)容"""
  try:
    with open(file_name, "rb") as f:
      content = f.read()
    return content
  except:
    print("沒(méi)有下載的文件:%s" % file_name)


def main():

  if len(sys.argv) != 2:
    print("請(qǐng)按照如下方式運(yùn)行:python3 xxx.py 7890")
    return
  else:
    # 運(yùn)行方式為python3 xxx.py 7890
    port = int(sys.argv[1])

  # 創(chuàng)建socket
  tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # 本地信息
  address = ('', port)
  # 綁定本地信息
  tcp_server_socket.bind(address)
  # 將主動(dòng)套接字變?yōu)楸粍?dòng)套接字
  tcp_server_socket.listen(128)

  while True:
    # 等待客戶(hù)端的鏈接,即為這個(gè)客戶(hù)端發(fā)送文件
    client_socket, clientAddr = tcp_server_socket.accept()
    # 接收對(duì)方發(fā)送過(guò)來(lái)的數(shù)據(jù)
    recv_data = client_socket.recv(1024) # 接收1024個(gè)字節(jié)
    file_name = recv_data.decode("utf-8")
    print("對(duì)方請(qǐng)求下載的文件名為:%s" % file_name)
    file_content = get_file_content(file_name)
    # 發(fā)送文件的數(shù)據(jù)給客戶(hù)端
    # 因?yàn)楂@取打開(kāi)文件時(shí)是以rb方式打開(kāi),所以file_content中的數(shù)據(jù)已經(jīng)是二進(jìn)制的格式,因此不需要encode編碼
    if file_content:
      client_socket.send(file_content)
    # 關(guān)閉這個(gè)套接字
    client_socket.close()

  # 關(guān)閉監(jiān)聽(tīng)套接字
  tcp_server_socket.close()


if __name__ == "__main__":
  main()

以上就是python實(shí)現(xiàn)簡(jiǎn)單的tcp文件下載的詳細(xì)內(nèi)容,更多關(guān)于python tcp下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論