Python實現(xiàn)簡易UDP通信程序

UDP簡介

UDP是OSI參考模型中一種無連接的傳輸層協(xié)議,它主要用于不要求分組順序到達的傳輸中,分組傳輸順序的檢查與排序由應(yīng)用層完成,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。UDP 協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議使用端口分別運行在同一臺設(shè)備上的多個應(yīng)用程序。

UDP提供了無連接通信,且不對傳送數(shù)據(jù)包進行可靠性保證,適合于一次傳輸少量數(shù)據(jù),UDP傳輸?shù)目煽啃杂蓱?yīng)用層負責(zé)。常用的UDP端口號有:53(DNS)、69(TFTP)、161(SNMP),使用UDP協(xié)議包括:TFTP、SNMP、NFS、DNS、BOOTP。

UDP報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為UDP協(xié)議的控制選項較少,在數(shù)據(jù)傳輸過程中延遲小、數(shù)據(jù)傳輸效率高,適合對可靠性要求不高的應(yīng)用程序,或者可以保障可靠性的應(yīng)用程序,如DNS、TFTP、SNMP等。

Python實現(xiàn)簡易UDP程序

UDP server

#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學(xué)習(xí)時編寫,僅供自娛自樂!
# 本人QQ:1945962391 
# 歡迎留言討論,共同學(xué)習(xí)進步!

from Tools import GET_IP_netifaces
import socket
import sys
import time

localnets = input('請輸入需要監(jiān)聽的網(wǎng)卡名稱:')
localport = input('請輸入需要監(jiān)聽的端口:')
localip = GET_IP_netifaces.get_ip_address(localnets)
ipadress = (localip, int(localport))
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 創(chuàng)建udp的socket套接字
udp_socket.bind(ipadress)  # 綁定ip地址及端口

print('Server端已準備就緒!等待數(shù)據(jù)傳輸')

while True:
    try:
        data, ipaddr = udp_socket.recvfrom(2048)
        if not data:
            print('客戶端程序已退出!服務(wù)端即將斷開')
            time.sleep(1)
            break
        print('接收來自', ipaddr, '的數(shù)據(jù)!', '傳輸內(nèi)容為:', data)
    except KeyboardInterrupt:
        print('服務(wù)端準備退出!')
        time.sleep(1)
        sys.exit()
udp_socket.close()

運行效果

server端

UDP client

#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 該代碼由本人學(xué)習(xí)時編寫,僅供自娛自樂!
# 本人QQ:1945962391 
# 歡迎留言討論,共同學(xué)習(xí)進步!

import socket
import sys
import time

server_ip = input('請輸入需要連接UDP服務(wù)端的IP地址:')
server_port = input('請輸入需要連接UDP服務(wù)端的端口號:')
ipaddress = (server_ip, int(server_port))  # 設(shè)置需要連接的服務(wù)端地址與端口
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 創(chuàng)建udp連接
udp_socket.connect(ipaddress)  # 連接服務(wù)端

while True:
    try:
        data = input('請輸入需要傳輸?shù)臄?shù)據(jù):')
        if not data:  # 如果無數(shù)據(jù)輸入,發(fā)送空數(shù)據(jù),并退出循環(huán)
            udp_socket.sendto(data.encode(), ipaddress)
            print('無數(shù)據(jù)輸入,程序即將退出!')
            time.sleep(1)
            break
        else:  # 否則傳輸數(shù)據(jù),繼續(xù)循環(huán)
            udp_socket.sendto(data.encode(), ipaddress)
            print('數(shù)據(jù)傳輸完畢!')
    except KeyboardInterrupt:  # 如客戶輸入ctrl+c,打印提示信息,退出程序
        print('用戶手動退出程序!')
        sys.exit()
udp_socket.close()

運行效果

client

server端接收數(shù)據(jù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容