1. 程式人生 > 程式設計 >詳解如何用python實現一個簡單下載器的服務端和客戶端

詳解如何用python實現一個簡單下載器的服務端和客戶端

話不多說,先看程式碼:

客戶端:

import socket
def main():
  #creat:
  download_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #link:
  serv_ip=input("please input server IP")
  serv_port=int(input(("please input server port")))
  serv_addr=(serv_ip,serv_port)
  download_client.connect(serv_addr)
  #send and receive
  filename=input("please input filename")
  download_client.send(filename.encode("utf-8"))
  download_data=download_client.recv(1024)
  if download_data:
    with open("receive_"+filename,"wb") as f:
      f.write(download_data)
  download_client.close()
if __name__ == '__main__':
  main()

伺服器:

import socket
def send_data(server_socket):
  while True:
    filename = server_socket.recv(1024).decode("utf-8")
    print("使用者請求下載物件是%s"%filename)
    if filename:
      with open(filename,"rb") as f:
        file_data = f.read()
        server_socket.send(file_data)
    else:
      server_socket.close()
      break
def main():
  #creat
  server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #bind
  server.bind(("",4399))
  #listen
  server.listen(128)
  #accept
  while True:
    print("waiting for quest")
    server_socket,client_ip=server.accept()
    print("connected")
    send_data(server_socket)
  #close
  server.close()
if __name__ == '__main__':
  main()

前幾天有寫一個基於UDP的簡單程式,今天學習了TCP,TCP與UDP 的區別與聯絡其實已經寫得很清楚了,這裡不再多說。今天使用的TCP,在檔案下載方面應用更加廣泛(可靠)。客戶端分析:

1.注意到TCP協議是面向連線的,也就是每一個TCP,從客戶端傳送請求,需要與伺服器建立一個連線(UDP不用)。所以這一點體現在程式中就有了一個connect動作

2.目前程式recv方法僅支援1kb,收發大檔案會出錯,這點在我之後搞清楚大檔案下載再說

伺服器分析:

1.伺服器是需要繫結的,也就是需要把他的地址定下來,這樣客戶端才會知道每次要和誰建立連結。

2.socket之listen,之前的網路連結我們都是主動的去連線別人,如connect(),伺服器是不需要連線別人的,所以他是一個被動連線,等著別人來連線他。listen就是拿來轉換的。後面的引數是引數指定佇列中最多可容納的等待接受的傳入連線數。若要確定可指定的最大連線數,要參照 MaxConnections 值。也就是等著連線的最大數。

3.accept()返回引數是一個元組,前面我們就用兩個變數對他進行拆包了,第一個是一個socket物件,第二個是連線本伺服器的地址。對於這個新的socket物件可以理解為伺服器主socket接到連線後派遣了一個專員socket來對這個客戶端進行服務。

4.一個伺服器可以被多個客戶端連線,每個客戶端都會被分配一個專員進行服務。

總結:

客戶端流程:建立套接字(可繫結)—連線伺服器—收發—關閉
伺服器流程:建立套接字—繫結—監聽連線—接收連線—收發—關閉

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。