python udp编程_Python UDP编程
1. UDP
UDP,用戶數(shù)據(jù)報傳輸協(xié)議,它位于TCP/IP協(xié)議的傳輸層,是一種無連接的協(xié)議,它發(fā)送的報文不能確定是否完整地到達了另外一端
TCP是建立可靠連接,并且通信雙方都可以以流的形式發(fā)送數(shù)據(jù)。相對TCP,UDP則是面向無連接的協(xié)議。
使用UDP協(xié)議時,不需要建立連接,只需要知道對方的IP地址和端口號,就可以直接發(fā)數(shù)據(jù)包。但是,能不能到達就不知道了。
雖然用UDP傳輸數(shù)據(jù)不可靠,但它的優(yōu)點是和TCP比,速度快,對于不要求可靠到達的數(shù)據(jù),就可以使用UDP協(xié)議。
我們來看看如何通過UDP協(xié)議傳輸數(shù)據(jù)。和TCP類似,使用UDP的通信雙方也分為客戶端和服務器。服務器首先需要綁定端口
2. TCP/IP協(xié)議(族)
早期的計算機網(wǎng)絡,都是由各廠商自己規(guī)定一套協(xié)議,IBM、Apple和Microsoft都有各自的網(wǎng)絡協(xié)議,互不兼容
為了把全世界的所有不同類型的計算機都連接起來,就必須規(guī)定一套全球通用的協(xié)議,為了實現(xiàn)互聯(lián)網(wǎng)這個目標,互聯(lián)網(wǎng)協(xié)議簇(Internet Protocol Suite)就是通用協(xié)議標準。
因為互聯(lián)網(wǎng)協(xié)議包含了上百種協(xié)議標準,但是最重要的兩個協(xié)議是TCP和IP協(xié)議,所以,大家把互聯(lián)網(wǎng)的協(xié)議簡稱TCP/IP協(xié)議
3. 端口
根據(jù)IP找到這臺電腦,根據(jù)端口port找到進程。
端口號
在linux系統(tǒng)中,端口可以有65536(2的16次方)個之多!
既然有這么多,操作系統(tǒng)為了統(tǒng)一管理,所以進行了編號,這就是端口號
端口是通過端口號來標記的,端口號只有整數(shù),范圍是從0到65535
知名端口(Well Known Ports)
知名端口是眾所周知的端口號,范圍從0到1023
80端口分配給HTTP服務
21端口分配給FTP服務
可以理解為,一些常用的功能使用的號碼是估計的,好比 電話號碼110、10086、10010一樣
一般情況下,如果一個程序需要使用知名端口的需要有root權限
動態(tài)端口(Dynamic Ports)
動態(tài)端口的范圍是從1024到65535
之所以稱為動態(tài)端口,是因為它一般不固定分配某種服務,而是動態(tài)分配。
動態(tài)分配是指當一個系統(tǒng)進程或應用程序進程需要網(wǎng)絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當這個進程關閉時,同時也就釋放了所占用的端口號。
怎樣查看端口 ?
用“netstat -an”查看端口狀態(tài) 本地地址后面的就是端口號
C:\Users\Administrator>netstat -an
活動連接
協(xié)議 本地地址 外部地址 狀態(tài)
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:902 0.0.0.0:0 LISTENING
TCP 0.0.0.0:912 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1688 0.0.0.0:0 LISTENING
..............
..............
用“netstat -ano”查看端口狀態(tài),還有pid
C:\Users\Administrator>netstat -ano
活動連接
協(xié)議 本地地址 外部地址 狀態(tài) PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 904
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 2268
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:902 0.0.0.0:0 LISTENING 2056
TCP 0.0.0.0:912 0.0.0.0:0 LISTENING 2056
TCP 0.0.0.0:1688 0.0.0.0:0 LISTENING 3648
TCP 0.0.0.0:2425 0.0.0.0:0 LISTENING 3016
4. ip地址
ip地址:用來在網(wǎng)絡中標記一臺電腦的一串數(shù)字,比如192.168.1.1;在本地局域網(wǎng)上是惟一的。
ip地址的分類
每一個IP地址包括兩部分:網(wǎng)絡地址和主機地址
A類IP地址
一個A類IP地址由1字節(jié)的網(wǎng)絡地址和3字節(jié)主機地址組成,網(wǎng)絡地址的最高位必須是“0”,
地址范圍1.0.0.1-126.255.255.254
二進制表示為:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
可用的A類網(wǎng)絡有126個,每個網(wǎng)絡能容納1677214個主機
B類IP地址
一個B類IP地址由2個字節(jié)的網(wǎng)絡地址和2個字節(jié)的主機地址組成,網(wǎng)絡地址的最高位必須是“10”,
地址范圍128.1.0.1-191.255.255.254
二進制表示為:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
可用的B類網(wǎng)絡有16384個,每個網(wǎng)絡能容納65534主機
C類IP地址
一個C類IP地址由3字節(jié)的網(wǎng)絡地址和1字節(jié)的主機地址組成,網(wǎng)絡地址的最高位必須是“110”
范圍192.0.1.1-223.255.255.254
二進制表示為: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
C類網(wǎng)絡可達2097152個,每個網(wǎng)絡能容納254個主機
D類地址用于多點廣播
D類IP地址第一個字節(jié)以“1110”開始,它是一個專門保留的地址。
它并不指向特定的網(wǎng)絡,目前這一類地址被用在多點廣播(Multicast)中
多點廣播地址用來一次尋址一組計算機
地址范圍224.0.0.1-239.255.255.254
E類IP地址
以“1111”開始,為將來使用保留
E類地址保留,僅作實驗和開發(fā)用
私有ip
在這么多網(wǎng)絡IP中,國際規(guī)定有一部分IP地址是用于我們的局域網(wǎng)使用,也就
是屬于私網(wǎng)IP,不在公網(wǎng)中使用的,它們的范圍是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
注意
IP地址127.0.0.1~127.255.255.255用于回路測試,
如:127.0.0.1可以代表本機IP地址,用http://127.0.0.1 就可以測試本機中配置的Web服務器。
4. socket簡介
socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現(xiàn)不同主機間的進程間通信,我們網(wǎng)絡上各種各樣的服務大多都是基于 Socket 來完成通信的
創(chuàng)建socket
socket.socket(AddressFamily, Type)
說明:
函數(shù) socket.socket 創(chuàng)建一個 socket,返回該 socket 的描述符,該函數(shù)帶有兩個參數(shù):
1 Address Family:可以選擇 AF_INET(用于 Internet 進程間通信) 或者 AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET
2 Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協(xié)議)或者 SOCK_DGRAM(數(shù)據(jù)報套接字,主要用于 UDP 協(xié)議)
import socket
mdpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
創(chuàng)建Socket時,SOCK_DGRAM指定了這個Socket的類型是UDP
5. udp網(wǎng)絡程序-發(fā)送數(shù)據(jù)
socket函數(shù)
mySocket = socket(family, type)
函數(shù)socket()的參數(shù)family用于設置網(wǎng)絡通信的域,函數(shù)socket()根據(jù)這個參數(shù)選擇通信協(xié)議的族。通信協(xié)議族在文件sys/socket.h中定義。
函數(shù)socket()的參數(shù)type用于設置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數(shù)據(jù)包套接字)等。
并不是所有的協(xié)議族都實現(xiàn)了這些協(xié)議類型,例如,AF_INET協(xié)議族就沒有實現(xiàn)SOCK_SEQPACKET協(xié)議類型。
做一個簡單的服務端,綁定一個端口
import socket
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
bindAdress =('',10086)
udpSocket.bind(bindAdress)#綁定一個端口
while True:
recvDate,recvAddr = udpSocket.recvfrom(1024)#如果沒有收到發(fā)往這個綁定端口的消息,會一直阻塞在這里
recvMsg = '【Receive from %s : %s】:%s'%(recvAddr[0],recvAddr[1],recvDate.decode('gbk'))
print(recvMsg)
發(fā)消息的客戶端
import socket
mySocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sendAddr=('192.168.11.67',10086)
msg = input('>>')
msg = msg.encode('gbk')
mySocket.sendto(msg,sendAddr)
mySocket.close()
發(fā)送123到10086端口
G:\tools\python3.5\python.exe E:/workspace/day26/01_socket.py
>>123
服務端收到消息
G:\tools\python3.5\python.exe E:/workspace/day26/08_服務端綁定端口.py
【Receive from 192.168.11.67 : 54658】:123
6. udp網(wǎng)絡通信過程
Paste_Image.png
7. 總結
udp是TCP/IP協(xié)議族中的一種協(xié)議能夠完成不同機器上的程序間的數(shù)據(jù)通信
udp服務器、客戶端
udp的服務器和客戶端的區(qū)分:往往是通過請求服務和提供服務來進行區(qū)分
1.請求服務的一方稱為:客戶端
2.提供服務的一方稱為:服務器
udp綁定問題
一般情況下,服務器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發(fā)送到此進程
客戶端,一般不需要綁定,而是讓操作系統(tǒng)隨機分配,這樣就不會因為需要綁定的端口被占用而導致程序無法運行的情況
總結
以上是生活随笔為你收集整理的python udp编程_Python UDP编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 甜美可爱少女系qq名字131个
- 下一篇: python 线性回归 技术方案亮点_基