Python之網絡編程 UDP/TCP/ FTP

網絡編程

  • 網絡:
  • 網絡協議:一套規則
  • 網絡模型: 
    • 七層模型 
      • 物理層:網線,水晶頭等
      • 數據鏈路層:
      • 網絡層
      • 傳輸層
      • 會話層
      • 表示層
      • 應用層
    • 四層模型- 時間應用 
      • 鏈路層
      • 網絡
      • 傳輸層
      • 應用層
  • 每一層都有相應的協議負責交換信息或者協同工作
  • TCP/IP協議族
  • IP地址:負責在網路上唯一定位一個機器 
    • IP地址分ABCDE類
    • 是由四個數字段組成,每個數字段的取值是0~255
    • 192.168.xxx.xxx:局域網IP
    • 127.0.0.1:本機
    • IPv4,IPv6
  • 端口 
    • 範圍:0-65535
    • 知名端口: 0-1023
    • 非知名端口:1024-65535

TCP/UDP協議

  • UDP協議:非安全的面向鏈接的傳輸 
    • 安全性差
    • 大小限制64kb
    • 沒有順序
    • 速度快
  • TCP 
    • 基於鏈接的通信
  • SOCKET編程

    • socket(套接字):是一個網絡通信的端點,能實現不同主機的進程通信。
    • 通過IP+端口定位對方發送消息的通信機制
    • 分爲UDP和TCP
    • 客戶端Client:發起訪問的一方
    • 服務器端Server:接受訪問的一方

       

  • UDP編程

    • Server端流程
      1. 建立socket,socket是負責具體通信的一個實例 
      2. 綁定,爲創建的socket指派固定的端口和ip地址
      3. 接受對方發送的內容
      4. 給對方發送反饋,此步驟爲非必須步驟
    • Client端流程 
      1. 建立通信的socket
      2. 發送內容到指定服務器
      3. 接受服務器給定的反饋內容
      4. (服務器程序要求永久運行,一般用死循環處理)
# -*- coding:utf-8 -*-
"""
Server段流程
1、建立socket
2、
3、
4、
"""

import socket


def serverFunc():
    # 1、建立socket
    # socket.AF_INET :使用IPv4協議族
    # socket.SOCK_DGRAM: 使用UDP通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2、綁定IP的端口
    # 地址是一個tuple類
    address = ("127.0.0.1", 8989)
    sock.bind(address)

    # 3\接收對方消息
    # 等待方式爲死等
    # recvfrom接收的返回值是一個tuple,前一項表示數據,後一項表示地址
    # 參數的含義是緩衝區大小

    data, address = sock.recvfrom(500)

    print(data)
    print(type(data))

    # 4\發送過來的數據是bytes格式,必須通過解碼才能得到str格式
    # decode默認解碼格式utf-8
    text = data.decode()

    print(text)
    print(type(text))

    # 返回消息

    req = "I am not wtt"

    # 發送消息 默認編碼utf-8
    data = req.encode()

    sock.sendto(data, address)


if __name__ == '__main__':
    print("Starting Server ....")
    serverFunc()
    print("Start SUEESS!")
Starting Server ....
# -*- coding:utf-8 -*-

import socket


def clientFunc():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    text = "I LOve wtt"

    data = text.encode()

    sock.sendto(data, ('127.0.0.1', 8989))

    data, address = sock.recvfrom(200)

    data = data.decode()

    print(data)


if __name__ == '__main__':
    clientFunc()

TCP編程

  • 面向鏈接的傳輸,即每次傳輸之前需要建立一個鏈接
  • 客戶端和服務端兩個程序需要編寫
  • Server端編寫流程

    • 1、建立socket負責具體通信,這個socket其實只負責接受對方的請求
    • 2、綁定IP和端口
    • 3、監聽接入的訪問socket
    • 4、接收訪問的socket,可以理解接收訪問即建立一個通訊的鏈接通路
    • 5、 接收對方的發送內容,利用接收到的socket接收內容
    • 6、如果有必要,給對方發送返回信息
    • 7、關閉鏈接通路
  • Client端編程

    • 1、建立通信socket
    • 2、鏈接對方,請求跟對方建立通路
    • 3、發送內容到對方服務器
    • 4、接收對方的反饋
    • 5、關閉鏈接通路
# -*- coding:utf-8 -*-
"""
Server段流程
"""

import socket


def serverFunc():
    # 1、建立socket
    # socket.AF_INET :使用IPv4協議族
    # socket.SOCK_DGRAM: 使用UDP通信
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2、綁定IP的端口
    # 地址是一個tuple類
    address = ("127.0.0.1", 8989)
    sock.bind(address)

    # 3、監聽接入的訪問socket
    sock.listen()

    while True:
        # 4、接收訪問的socket
        # accept 返回的元祖第一個元素賦值給skt,第二個賦值給address
        skt, address = sock.accept()
        # 5、接收對方發送的消息,利用socket接收內容
        # 500代表接收使用的buffersize
        msg = skt.recv(500)
        # 接收到的是bytes格式內容
        # 想得到str格式的,需要進行解碼
        msg = msg.decode()

        rst = "Received msg:{0} from {1}".format(msg, address)

        print(rst)

        # 6、如果有必要,給對方發送返回消息

        skt.send(rst.encode())
        # 7、關閉鏈接

        skt.close()


if __name__ == '__main__':
    print("Starting Server ....")
    serverFunc()
    print("Start SUEESS!")
# -*- coding:utf-8 -*-

import socket

def tcp_clt():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    address = ('127.0.0.1', 8989)

    sock.connect(address)

    msg = "djksajdaskd你撒的d"

    sock.send(msg.encode())

    ret = sock.recv(500)

    print(ret.decode())

    sock.close()


if __name__ == '__main__':
    tcp_clt()

FTP編程

  • FTP(File Transfer Protocal)文件傳輸協議
  • 用途:定製一些特殊的上傳下載文件的服務
  • 用戶分類:登錄FTP服務器必須有一個賬號
    • Real賬戶:註冊賬戶
    • Guest賬戶:可能臨時對某一類人的行爲進行授權
    • Anonymous賬戶:匿名賬戶,允許任何人 
  •  FTP工作流程 
  1. 客戶端連接遠程主機上的FTP服務器 
  2. 客戶端輸入用戶名和密碼(或者“Anonymous”和電子郵件地址)
  3. 客戶端和服務器進行各種文件傳輸和信息查詢操作
  4. 客戶端從遠程FTP服務器退出,結束傳輸
  • FTP文件表示 
  1. 分三段表示FTP服務器上的文件
    1. HOST:主機地址,類似於ftp.mozilla.org,以ftp開頭
    2. OIR:目錄,表示文件所在本地的路徑
    3. File:文件名稱
    4. 如果想完整精確的表示ftp上某一個文件,需要上述三部分組合在一起
#導入相應的包,主要是ftplib
import ftplib#關於ftp的操作都在這個包裏面
import oss
import socket

#三部分精確表示在ftp服務器上的某一個文件
#好多公開ftp服務器訪問會出錯或者沒反應
HOST = "ftp.acc.umu.se"
DIR = 'Public/EFLIB'
FILE = 'README'

#1.客戶端連接遠程主機上的FTP服務器
try:
    f = ftplib.FTP()
    #通過設置調試級別可以方便調試
    f.set_debuglevel(2)
    #連接主機地址
    f.connect(HOST)
except Exception as e:
    print(e)
    exit()
print("Connected to host {0}".format(HOST))

#2.客戶端輸入用戶和密碼(或者“anonymous”和電子郵件地址)
try:
    #更改當前目錄到指定目錄
    f.cwd(DIR)
except Exception as e:
    print(e)
    exit()
print("Connected dir to {0}".format(DIR))

try:
    #從ftp服務器上下載文件
    #第一個參數是ftp命令
    #第二個參數是回調函數
    #此函數的意思是,執行RETR命令,下載文件到本地後,運行回調函數
    f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
    print(e)
    exit()
#4.客戶端從遠程ftp服務器退出,結束傳輸
f.quit()

 

 

 

 

發佈了36 篇原創文章 · 獲贊 24 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章