網絡通信基本概述
- 網絡是什么?
- 網絡就是輔助雙方或多方連接在一起的工具
- 使用網絡的目的?
- 使連接網絡的多方,能進行數據傳遞
- 網絡編程是什么?
- 就是讓在不同電腦上的軟件能進行數據傳遞
- IP地址是什么?
- 用來在網絡中標記一臺電腦,比如:192.168.1.1;在本地局域網內是唯一的
- 查看本機ip地址
- 在dos命令窗口中,輸入:ipconfig
- 什么是端口?
- 端口是通過端口號來標記的,范圍是從 0~65535
- 知名端口
- 眾所周知的端口號,范圍 0~1023,例如:80端口是http的,21端口是ftp用的
- 一般情況下,程序要使用知名端口是需要管理員權限的
- 動態端口
- 動態端口一般不固定,是動態分配的,范圍從 1024~65535
- 動態分配是指,當一個程序需要網絡通信時,它向主機申請一個端口,主機從可用的端口中分配一個供它使用,當這個程序關閉時,同時會釋放占用的端口
- 可以在命令窗口中輸入:** netstat -ano **查看端口狀態
socket概述
- 什么是socket?
- socket 簡稱 套接字 ,是進程間通信的一種方式,它與其它進程間通信的一個主要不同是:它能實現不同主機間的通信,例如:QQ、微信等
- 在Python中,使用socket 模塊的函數 socket 來創建通信
語法
import socket
socket.socket(family,type)
參數說明
- **family: **可以選擇 AF_INET(用于Internet 進程間通信) 或者 AF_UNIX (用于另一臺機器進程間通信),實際工作中常用AF_INET
- Type: 套接字類型,可以是SOCK_STREAM(流式套接字,主要用于TCP協議) 或者 SOCK_DGRAM(數據報套接字,主要用于UDP協議)
**說明
**
- 套接字使用流程與文件使用流程類似
- 創建套接字
- 使用套接字收/發數據
- 關閉套接字
示例
import socket
# 創建TCP的套接字 (點對點)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 發送或者接收信息 ...
# 關閉套接字
s.close()
# 創建UDP的套接字 (一對多,廣播形式)
s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 發送或者接收信息 ...
# 關閉套接字
s2.close()
UDP協議
- 介紹
- 用戶數據報協議,是一個無連接的簡單的面向數據報的運輸層協議
- UDP數據包括目的端口號和源端口號信息,由于通訊不需要連接,所以可以實現廣播發送
- 優點
- 傳輸速度快
- 有效傳輸的數據量最多為500bytes
- 缺點
- 發送數據,無需對方確認(不可靠)
- 容易丟包
- 應用場景
- UDP廣泛應用于需要相互傳輸數據的網絡應用中,如QQ使用的就是UDP協議
- 在局域網中,如果要想局域網內所有計算機發送數據,可以使用廣播,廣播不能用TCP實現,可以用UDP實現
**示例
**
**客戶端
**
import socket
# 創建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 允許套接口傳送廣播信息,當option_value不等于0時,允許,否則,禁止
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
port=33333
# ip 為廣播形式,也可以用255.255.255.25 表示全局域網都可以接收
network=''
# 發送廣播數據
udpSocket.sendto("我在發送數據!!".encode("utf-8"),(network,port))
# 關閉
udpSocket.close()
服務端
import socket
# 創建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 允許套接口傳送廣播信息
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
port=33333
# 綁定ip和端口,本機ip可以不寫
udpSocket.bind(('',port))
# 等待接收方發送數據,1024表示本次接收的最大字節數
data,address=udpSocket.recvfrom(1024)
print("接收到的數據是:%s,地址是:%s"%(data.decode("utf-8"),str(address)))
# 關閉
udpSocket.close()
TCP協議
- 介紹
- TCP協議,是一種傳輸控制協議,是一種面向連接的,可靠的,基于字節流的傳輸層控制協議,由IETF的RFC 793定義
- TCP是一種點對點的傳輸方式
- TCP協議編寫的三個步驟:創建連接、數據傳遞、關閉連接
- TCP 通信模型中,在通信開始之前,一定要先建立相關的連接,才能發送數據
- 優點
- 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接
- 在數據傳遞時,有確認、重傳、擁塞控制機制
- 在數據傳完后,會斷開連接用來節約系統資源
- 缺點
- 慢,效率低,占用系統資源高
- 易被攻擊,TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊
TCP與UDP的區別
- 面向連接
- TCP面向連接(如打電話要先撥號建立連接)
- UDP是無連接的,即發送數據之前不需要建立連接
- 可靠
- TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達
- UDP盡最大努力交付,不需要對方確認,即不保證可靠交付
- 字節流
- TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流
- UDP是面向報文的,UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
- 連接性
- TCP連接只能是點到點的
- UDP支持一對一,一對多,多對一和多對多的交互通信
- 首部開銷
- TCP首部開銷20字節
- UDP首部開銷小,只有8個字節
- 信道
- TCP的邏輯通信信道是全雙工的可靠信道
- UDP則是不可靠信道
示例
服務端
import socket
# 創建tcp 的套接字
tcp_socekt=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# ip與端口,本機ip可以不寫
addr=('',44444)
# 綁定地址
tcp_socekt.bind(addr)
# 使用socket創建的套接字默認的屬性是 主動的,使用 listen 將其變為被動,這樣就可以接收別人的連接了, 128表示允許的最大連接數
tcp_socekt.listen(128)
# 如果有一個新的客戶端來連接服務器,那么就產生一個新的套接字專門為這個客戶端服務
# client_socket 用來為這個客戶端服務
# tcp_socket 就可以用來專門等待其他新客戶端的鏈接
client_socket,client_addr=tcp_socekt.accept()
# 接收對方發過來的數據
data=client_socket.recv(1024)
print("接收到的數據是:%s,地址是:%s"%(data.decode("utf-8"),str(client_addr)))
# 發送數據到客戶端
client_socket.send("hello....".encode("utf-8"))
# 關閉為這個客戶端服務的套接字,一旦關閉,就意味著不能再為這個客戶端服務了
client_socket.close()
# 關閉外面總的 套接字,一旦關閉,則意味著不再接收任何連接了
tcp_socekt.close()
客戶端
import socket
# 創建tcp 套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 目標服務器地址
dest_addr=("127.0.0.1",44444)
# 連接目標服務器
tcp_socket.connect(dest_addr)
# 發送數據
tcp_socket.send("我是客戶端".encode("utf-8"))
# 接收對方發過來的數據,最大接收1024個字節
data=tcp_socket.recv(1024)
print("接收到的數據是:%s"%data.decode("utf-8"))
# 關閉套接字
tcp_socket.close()
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
網絡
+關注
關注
14文章
7583瀏覽量
88949 -
工具
+關注
關注
4文章
314瀏覽量
27833 -
輔助
+關注
關注
0文章
8瀏覽量
10529
發布評論請先 登錄
相關推薦
Labview與Python的網絡編程
Labview素有測試之王的美譽,圖形化編程和快速搭建自動化平臺讓人愛不釋手。但是Labview不能在安卓平臺上運行,開發web也力不從心。如果labview配合上Python簡直就如虎添翼了
發表于 11-12 13:48
設計多網絡協議的Python網絡編程的探索性指南
很高興看到本書出版了,我要感謝所有為本書的出版做出貢獻的人。本書是Python網絡編程方面的探索性指南,涉及了很多網絡協議
發表于 09-14 10:47
?5次下載
python-速成指南
python 提供好用的兩個容器:list 和 dict。插句題外話,其實最好用的容器還是 PHP 提供的關聯數組,一個數組就包括了 python 中 list 和 dict 的全部功能,實在是很贊。
發表于 03-28 16:32
?9次下載
如何搭建Python編程環境
Python是一種高級編程語言,被廣泛用于科學計算、數據分析、人工智能、Web開發等領域。想要學習Python編程,首先需要搭建一個合適的編程
如何使用Python進行神經網絡編程
。 為什么使用Python? Python是一種廣泛使用的高級編程語言,以其易讀性和易用性而聞名。Python擁有強大的庫,如TensorFlow、Keras和PyTorch,這些庫提
Python編程:處理網絡請求的代理技術
在網絡編程中,代理技術扮演著至關重要的角色,尤其在處理網絡請求時。通過代理服務器,我們可以實現請求的轉發、緩存、負載均衡以及安全控制等功能。Python作為一種功能強大的
評論