自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入Python中的網(wǎng)絡(luò)通信

系統(tǒng)
計(jì)算機(jī)與網(wǎng)絡(luò)設(shè)備兩情侶要談戀愛(ài),相互通信,那么雙方就必須有規(guī)則?;谙嗤姆椒?,不同的硬件、操作系統(tǒng)之間的通信,都需要一種規(guī)則。而我們就把這種規(guī)則稱(chēng)為協(xié)議(protocol)。

[[351789]]

 TCP/IP

計(jì)算機(jī)與網(wǎng)絡(luò)設(shè)備兩情侶要談戀愛(ài),相互通信,那么雙方就必須有規(guī)則?;谙嗤姆椒?,不同的硬件、操作系統(tǒng)之間的通信,都需要一種規(guī)則。而我們就把這種規(guī)則稱(chēng)為協(xié)議(protocol)。

TCP/IP 是互聯(lián)網(wǎng)相關(guān)各類(lèi)協(xié)議族的總稱(chēng)。TCP/IP是指TCP和IP這兩種協(xié)議。TCP/IP是在IP協(xié)議的通信過(guò)程中,使用到的協(xié)議族的統(tǒng)稱(chēng)。

TCP/IP協(xié)議族按層次分別為 應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層??梢园凑詹煌哪P头?層或者是7層。

將TCP/IP分為5層,越靠下越接近硬件。

應(yīng)用層:應(yīng)用程序收到傳輸層的數(shù)據(jù)后,接下來(lái)就是要進(jìn)行解讀,解讀必須要先規(guī)定好格式,而應(yīng)用層就是規(guī)定應(yīng)用程序的數(shù)據(jù)格式,主要協(xié)議有HTTP等。

傳輸層:該層為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信,傳輸層有兩個(gè)傳輸協(xié)議為T(mén)CP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議),TCP是一個(gè)可靠的面向連接的協(xié)議,UDP是不可靠或者說(shuō)無(wú)連接的協(xié)議。

網(wǎng)絡(luò)層:決定如何將數(shù)據(jù)從發(fā)送方到接收方,是建立主機(jī)到主機(jī)的通信。

數(shù)據(jù)鏈路層:控制網(wǎng)絡(luò)層與物理層之間的通信,主要功能是保證物理線路上進(jìn)行可靠的數(shù)據(jù)傳遞。

物理層:該層負(fù)責(zé)物理傳輸,與鏈路有關(guān),也與傳輸?shù)慕橘|(zhì)有關(guān)。


客戶端和服務(wù)器具體的

HTTP

圖片出自《圖解HTTP》書(shū)籍

三次握手,四次揮手

TCP三次握手,四次揮手,Runsen也不會(huì)怎么說(shuō),就把網(wǎng)上最通俗的圖放在下面 了,還是別看我很牛逼,牛逼的是做圖的大佬。

三次握手

四次揮手


圖片出自公眾號(hào)(程序員小小溪),更多的名詞和概念查找參考公眾號(hào)程序員小小溪的文章~[1]

Socket

網(wǎng)絡(luò)編程有一個(gè)重要的概念 socket(套接字),應(yīng)用程序可以通過(guò)它發(fā)送或接收數(shù)據(jù),套接字允許應(yīng)用程序?qū)?I/O 插入到網(wǎng)絡(luò)中,并與網(wǎng)絡(luò)中的其他應(yīng)用程序進(jìn)行通信。

我是來(lái)偷窺Python中的網(wǎng)絡(luò)通信Socket,不小心偷窺到了一個(gè)非常不錯(cuò)的Socket好圖


將上面的圖片整理步驟

1.建立連接:

  • 服務(wù)器:socket--->address--->bind--->listen--->accept
  • 客戶端:socket--->connect

2.通信:收一發(fā):recv(1024)<---send(byte)/sendall(byte)

3.關(guān)閉連接:close()

實(shí)現(xiàn)簡(jiǎn)單的通訊程序

服務(wù)端,server.py

  1. #導(dǎo)入socket模塊 
  2. import socket 
  3. #創(chuàng)建套接字 或使用server = socket.socket() 
  4. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  5. #定義綁定的ip和端口,用元組定義 
  6. ip_port = ('127.0.0.1', 8888) 
  7. #綁定監(jiān)聽(tīng):bind(address),在AF_INET下,以元組(ip,port)的形式表示地址 
  8. server.bind(ip_port) 
  9. #設(shè)置最大連接數(shù),默認(rèn)為1 
  10. server.listen(5) 
  11. #不斷接受連接:one by one 
  12. while True
  13.     print("等待數(shù)據(jù)連接中……"
  14.     #接受客服端數(shù)據(jù)請(qǐng)求 
  15.     conn, address = server.accept() 
  16.     ''
  17.     向客服端返回信息 
  18.     (注意:python3.x以上,網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送接收都是byte類(lèi)型, 
  19.     發(fā)送接收String類(lèi)型數(shù)據(jù)時(shí)需要對(duì)數(shù)據(jù)進(jìn)行編碼(發(fā)送:messages.enconde();接收后轉(zhuǎn)為String類(lèi)型:messages.deconde()),pyhon2.x則直接發(fā)送數(shù)據(jù)無(wú)須編碼) 
  20.     ''
  21.     messages = "連接成功!" 
  22.     conn.send(messages.encode()) 
  23.     #計(jì)數(shù)信息條數(shù) 
  24.     count = 0 
  25.     #一個(gè)連接中,不斷的接受客戶端發(fā)來(lái)的數(shù)據(jù) 
  26.     while True
  27.         data = conn.recv(1024) 
  28.         #打印客戶端發(fā)來(lái)的數(shù)據(jù)信息 
  29.         print(data.decode()) 
  30.         #判斷是否退出當(dāng)前連接,等在下一個(gè)連接 
  31.         if data == b'exit'
  32.           break 
  33.         #處理客戶端數(shù)據(jù)(如:響應(yīng)請(qǐng)求等) 
  34.         count = count + 1 
  35.         string = "第" + str(count) + "條信息:" + data.decode() 
  36.         conn.send(string.encode()) 
  37.         #主動(dòng)關(guān)閉連接 
  38.     conn.close() 

客戶端,client.py

  1. import socket 
  2.  
  3. #創(chuàng)建套接字 
  4. client = socket.socket() 
  5. #訪問(wèn)的服務(wù)器的ip和端口,用元組定義 
  6. ip_port = ("127.0.0.1", 8888) 
  7. #連接服務(wù)器主機(jī) 
  8. client.connect(ip_port) 
  9. #同一鏈接中,不斷向服務(wù)器發(fā)生數(shù)據(jù)或請(qǐng)求 
  10. while True
  11.     #接收服務(wù)器發(fā)送或響應(yīng)的數(shù)據(jù) 
  12.     data = client.recv(1024) 
  13.     #打印接收的數(shù)據(jù);python3.x以上數(shù)據(jù)要編碼(發(fā)送:data.enconde();接收后轉(zhuǎn)為String類(lèi)型:data.deconde()) 
  14.     print(data.decode()) 
  15.     messages = input("請(qǐng)輸入發(fā)生或請(qǐng)求的數(shù)據(jù)(exit退出):"
  16.     client.send(messages.encode()) 
  17.     if messages == 'exit'
  18.         break 
  19.     ''
  20.     #接收服務(wù)器發(fā)送或響應(yīng)的數(shù)據(jù) 
  21.     data = client.recv(1024) 
  22.     #打印接收的數(shù)據(jù);python3.x以上數(shù)據(jù)要編碼,發(fā)送enconde();接收deconde() 
  23.     print(data.decode()) 
  24.     ''
  25. #關(guān)閉連接 
  26. client.close() 

具體效果如下圖所示。


多線程通信TCP服務(wù)器與多個(gè)TCP客戶端同時(shí)進(jìn)行連續(xù)通信,只需要通過(guò)threading創(chuàng)建多線程任務(wù)handle_client就可以了。

  1. import socket 
  2. import threading 
  3. import random 
  4.  
  5.  
  6. def handle_client(): 
  7.     # 接受客戶端請(qǐng)求鏈接 
  8.     client, address = server.accept() 
  9.     print("[*] Accept connection from: %s:%d" % (address[0], address[1])) 
  10.     messages = "Hello World!" 
  11.     client.send(messages.encode()) 
  12.     # 連續(xù)與當(dāng)前連接的客戶端通信 
  13.     while True
  14.         # 接受客戶端數(shù)據(jù) 
  15.         request = (client.recv(1024)).decode() 
  16.         # 判斷是否結(jié)束通信 
  17.         if request == 'exit'
  18.             break 
  19.         print("[*] Received from %s:%d : %s" % (address[0], address[1], request)) 
  20.         # 發(fā)送響應(yīng)信息給客戶端 
  21.         client.send((str(random.randint(1, 1000)) + ":" + "ACK!").encode()) 
  22.     # 關(guān)閉當(dāng)前連接 
  23.     client.close() 
  24.  
  25.  
  26. if __name__ == "__main__"
  27.     # 創(chuàng)建套接字 
  28.     server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  29.     # 定義綁定ip和端口 
  30.     ip = '127.0.0.1' 
  31.     port = 8888 
  32.     # 綁定監(jiān)聽(tīng) 
  33.     server.bind((ip, port)) 
  34.     # 設(shè)置最大連接數(shù),默認(rèn)為1 
  35.     server.listen(5) 
  36.     print("[*] Listening on %s:%d" % (ip, port)) 
  37.     # 循環(huán)開(kāi)啟線程,接受多個(gè)客戶端的鏈接通信 
  38.     while True
  39.         # 創(chuàng)建一個(gè)線程 
  40.         client_handler = threading.Thread(target=handle_client) 
  41.         # 開(kāi)啟線程 
  42.         client_handler.start() 

 

python3.x以上,網(wǎng)絡(luò)數(shù)據(jù)messages的發(fā)送接收都是byte類(lèi)型,若要發(fā)送接收String類(lèi)型數(shù)據(jù)時(shí)需要通過(guò)messages.enconde()對(duì)數(shù)據(jù)進(jìn)行編碼,接收后通過(guò)messages.deconde()轉(zhuǎn)為String類(lèi)型。pyhon2.x則直接發(fā)送數(shù)據(jù)無(wú)須編碼。

本文已收錄 GitHub,傳送門(mén)~[2] ,里面更有大廠面試完整考點(diǎn),歡迎 Star。

Reference
[1] 參考公眾號(hào)程序員小小溪的文章:
https://mp.weixin.qq.com/s/KK1dnNoHrbjMyuhQptaBAQ

[2] 傳送門(mén)~:
https://github.com/MaoliRUNsen/runsenlearnpy100

 

責(zé)任編輯:姜華 來(lái)源: Python之王
相關(guān)推薦

2022-12-05 09:25:17

Kubernetes網(wǎng)絡(luò)模型網(wǎng)絡(luò)通信

2017-01-15 17:44:56

node網(wǎng)絡(luò)通信Socket

2019-10-22 08:11:43

Socket網(wǎng)絡(luò)通信網(wǎng)絡(luò)協(xié)議

2024-09-14 09:26:17

Python網(wǎng)絡(luò)編程

2009-12-10 15:39:34

動(dòng)態(tài)路由協(xié)議

2025-04-07 00:55:00

RustUDP編程

2019-04-29 10:26:49

TCP網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)通信

2009-08-24 17:20:13

C#網(wǎng)絡(luò)通信TCP連接

2024-11-25 16:39:17

2010-07-01 15:45:22

網(wǎng)絡(luò)通信協(xié)議

2025-04-17 01:44:00

2014-09-16 17:00:02

UDP

2010-06-09 11:57:42

網(wǎng)絡(luò)通信協(xié)議

2010-06-14 19:13:28

網(wǎng)絡(luò)通信協(xié)議

2021-08-13 11:27:25

網(wǎng)絡(luò)通信數(shù)據(jù)

2020-07-06 07:52:10

Kubernetes網(wǎng)絡(luò)通信

2010-06-29 10:15:31

局域網(wǎng)故障

2024-02-20 19:53:57

網(wǎng)絡(luò)通信協(xié)議

2021-08-30 13:08:56

Kafka網(wǎng)絡(luò)通信

2019-09-25 08:25:49

RPC網(wǎng)絡(luò)通信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)