網絡通信協議

網絡通信的基本要素

  物理介質

  通信協議

    物理層規定物理介質的相關規範 好比網線接口是什麼樣的 有幾根線程序員

      問題:沒法理解單純的二進制數據服務器

    數據鏈路層

      工做在這一層的是以太網網絡

      規定一組電信號有多少位架構

      每一組電信號包含什麼樣的內容socket

      每一臺電腦必須擁有一個全球惟一的mac地址(能夠有多個) ide

      經過廣播的方式來找到對方的mac地址函數

      問題:不可能 全球廣播 會形成廣播風暴(廣播太多 網絡癱瘓)學習

    網絡層

      工做在這一層的是ip地址spa

      網絡地址協議code

      給每一給計算機分配一個ip地址

      一般是ipv4

      0.0.0.0-255.255.255.255

      前三段爲網絡號

      後一段爲主機號

      子網掩碼來判斷是否處於同一個局域網

      arp協議把ip轉成mac地址的協議

      ip協議主要的目的就是 找到全球範圍內的某一個局域網存在某一臺具體的計算機

      問題:一個數據包到達對方計算機後到底交給哪一個應用程序來處理

    傳輸層

      TCP UDP

      用於規範數據傳輸方式,以及識別應用程序(端口號)

      TCP:可靠,效率低 由於其須要不斷的發送確認信息

        適用於:對數據完整性高的程序 好比支付數據 文字信息

      UDP:不可靠傳輸,效率高於TCP 徹底不關心 對方是否收到數據發送到網絡中就完事

        適用於:視頻聊天 語音 即時對戰遊戲

        至關於對講機 bp機

    應用層

      主要用於規定雙方應用程序之間以什麼形式來傳輸數據

      這一層的數據形式是有程序員本身制定的常見有HTTP FTP EMAIL等等

  socket

    封裝了傳輸層一堆協議的模塊

    何時使用

      當你須要開發一款 C/S架構的應用程序的時候 就須要它

      基於C/S架構的應用程序 須要分別開發服務器和客戶端程序

      學習的重點就是 如何使用socket編寫服務器程序以及如何使用socket編寫客戶端程序

      一般應該先開發服務器  

import socket

'''
1.買一個手機
2.買一個手機卡
3.開機待機
4.接通電話
5.嘮嗑
6.掛電話
7.關機
'''
# 1.買一個手機
# 默認狀況下建立的是基於強羅的TCP協議的socket對象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 參數1:協議家族 網絡的爲AF_INET
# 參數2:type 用於設置採用的傳輸協議 TCP的爲SOCK_STREAM  UDP的爲SOCK_DGRAM
# 其他參數默認便可
# 端口號取值 0-65535 0-1023 是系統保留的
# 重用端口號當你已經關閉了服務器 可是仍是報異常說 端口占用 時 可使用
s.setsockopt()
s.bind(('192.168.14.56', 8006))#也是一個阻塞的函數會一直等到
s.listen()  # 監聽客戶端的鏈接
# c_client 當接收到請求時會返回一個表示客戶端的socket對象
# 客戶端的socket對象就負責 這個客戶端的數據收發
# c_address同時返回對方的ip和端口 打包成元組
c_client, c_address = s.accept()  # 接收客戶端的鏈接請求 該函數會阻塞 直到有鏈接
# 開始收發數據
# recv接收數據
# buffersize緩衝區大小
data = c_client.recv(1024)
print(data)
# 斷開與這個客戶端的鏈接
c_client.close()
# 關閉服務器 socket 後續的客戶端就沒法子啊鏈接到服務器了
# 通常正常服務器時不關的
s.close()  # 關機
基於TCP的soket服務器
'''
服務器程序的大體流程
1.建立socket獨享
2.綁定ip和port
3.監聽鏈接
4.接受請求
5.接收數據
6.斷開鏈接
'''
import socket
# 建立socket對象
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 與服務器創立鏈接 傳入服務器的ip和端口
c.connect(('127.0.0.1', 8006))
# 收發數據 只能發送bytes類型的數據(任何數據都能發)
c.send('hello'.encode('utf-8'))
# 斷開與服務器來鏈接
c.close()
基於TCP的soket客戶端
import socket

s = socket.socket()
s.bind(('127.0.0.1', 8888))
s.listen()
while True:
    c, address = s.accept()
    print('收到請求')
    while True:
        try:
            data = c.recv(1024)
            if not data:
                print('客戶端下線了!')
                break
            print('收到一個數據', data.decode('utf-8'))
            data += b'dsb'
            c.send(data)
        except ConnectionResetError:
            print('對方異常斷開鏈接!')
            break
改良版服務器
import socket

s = socket.socket()
s.connect(('127.0.01', 8888))
while True:
    res = input('>>>(退出):').strip()
    if res == 'q':
        break
    if not res:
        continue
    s.send(res.encode('utf-8'))
    data = s.recv(1024)
    print(data)
改良版客戶端
相關文章
相關標籤/搜索