欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用python實(shí)現(xiàn)UDP通信方式

 更新時(shí)間:2022年05月18日 09:20:10   作者:skye_fly  
這篇文章主要介紹了使用python實(shí)現(xiàn)UDP通信方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python UDP通信

1.打開(kāi)虛擬通信程序,選擇UDP通信并選定收發(fā)數(shù)據(jù)的ip地址port端口

在這里插入圖片描述

2.在虛擬機(jī)中編寫(xiě)python程序與主機(jī)中的虛擬通信程序?qū)崿F(xiàn)數(shù)據(jù)傳輸:

#  注釋的標(biāo)注格式為:每行開(kāi)頭則直接輸入#并空一格開(kāi)始注釋
#  若在每行代碼后面加注釋,則空兩格輸入#再空一格開(kāi)始注釋
import socket
#  使用udp收發(fā)數(shù)據(jù)
def main():
	#  1.創(chuàng)建socket套接字
	udp_socket = socket.socket(socket.AF_INET, sock.SOCK_DGRAM)  # AF_INET表示使用ipv4,默認(rèn)不變,SOCK_DGRAM表示使用UDP通信協(xié)議
	
	#  2.綁定端口port
	local_addr = ("", 7878)  # 默認(rèn)本機(jī)任何ip ,指定端口號(hào)7878
	udp_socket.bind(local_addr)  # 綁定端口
	
	#  3.收發(fā)數(shù)據(jù)
	send_data = input("請(qǐng)輸入您想要發(fā)送的數(shù)據(jù):" )
	udp_socket.sendto(send_data.encode("utf-8"), ("10.80.34.68", 8080))  # 編碼成全球統(tǒng)一數(shù)據(jù)格式,用元組表示接收方ip和port
	recv_data = udp_socket.recvfrom(1024)  # 定義單次最大接收字節(jié)數(shù)
	
	#  4.打印數(shù)據(jù)
	recv_msg = recv_data[0]  # 接收的元組形式的數(shù)據(jù)有兩個(gè)元素,第一個(gè)為發(fā)送信息
	send_addr = recv_data[1]  # 元組第二個(gè)元素為發(fā)信息方的ip以及port
	print ("收到的信息為:", recv_msg.decode("gbk"))  # 默認(rèn)從windows發(fā)出的數(shù)據(jù)解碼要用”gbk”,保證中文不亂碼
	print ("發(fā)送方地址為:", str(send_addr))  # 強(qiáng)轉(zhuǎn)為字符串輸出地址,保證不亂碼
	
	#  5.關(guān)閉套接字
	udp_socket.close()
if __name__ == "__main__":
main()

對(duì)UDP協(xié)議的理解

Socket簡(jiǎn)介

網(wǎng)絡(luò)中進(jìn)程之間如何通信

1,在本地可以通過(guò)進(jìn)程PID來(lái)唯一標(biāo)識(shí)一個(gè)進(jìn)程,但是在網(wǎng)絡(luò)中這是行不通的。

2,TCP/IP協(xié)議族已經(jīng)幫我們解決了這個(gè)問(wèn)題,即:網(wǎng)絡(luò)層的ip地址可以唯一標(biāo)識(shí)網(wǎng)絡(luò)中的主機(jī);而傳輸層的:協(xié)議+端口,可以唯一標(biāo)識(shí)主機(jī)中的應(yīng)用程序(進(jìn)程)。

3,利用ip地址,協(xié)議,端口,就可以標(biāo)識(shí)網(wǎng)絡(luò)的進(jìn)程了,網(wǎng)絡(luò)中的進(jìn)程通信就可以利用這個(gè)標(biāo)識(shí)與其他進(jìn)程進(jìn)行交互。

什么是Socket?

socket,簡(jiǎn)稱:套接字,是進(jìn)程間通信的一種方式。socket與其他進(jìn)程間的通信方式不同在于:它能實(shí)現(xiàn)不同主機(jī)間的進(jìn)程間通信。例如:QQ聊天、瀏覽網(wǎng)頁(yè)、收發(fā)Email等等。

創(chuàng)建Socket

在Python中socket模塊的函數(shù)socket:

socket.socket(AddressFamily,Type)

加以說(shuō)明:

函數(shù)socket.socket創(chuàng)建一個(gè)socket,返回一個(gè)socket。

AddressFamily:選擇AF_INET用于網(wǎng)絡(luò)中進(jìn)程間通信或者AF_UNIX用于同一臺(tái)機(jī)器進(jìn)程間通信,實(shí)際工作中常用AF_INET。

Type:套接字類型,可以是SOCK_STREAM,流式套接字,主要用于tcp協(xié)議或者SOCK_DGRAM,數(shù)據(jù)報(bào)套接字,主要用于udp協(xié)議。

#import socket
# udp:sock_dgram:數(shù)據(jù)報(bào)套接字
# udpSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
#
#
# tcp:sock_stream:流式套接字
# tcpSocket = socket(AF_INET, SOCK_STREAM)

UDP特點(diǎn)

UDP:用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)無(wú)連接的簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒(méi)有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快。

UDP:是一種面向無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的

UDP是面向無(wú)連接的通訊協(xié)議,UDP數(shù)據(jù)包括目的端口號(hào)和源端口號(hào)信息,由于通訊不需要連接,所以可以實(shí)現(xiàn)廣播發(fā)送。

UDP傳輸數(shù)據(jù)時(shí)有大小限制,每個(gè)被傳輸?shù)臄?shù)據(jù)報(bào)必須限定在64KB之內(nèi)。

UDP是一個(gè)不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報(bào)并不一定以相同的次序到達(dá)接收方。

UDP一般用于多點(diǎn)通信和實(shí)時(shí)的數(shù)據(jù)業(yè)務(wù)。例如:語(yǔ)音廣播、QQ、視頻會(huì)議系統(tǒng)等。

UDP中客戶端和服務(wù)器端交互 

UDP中客戶端和服務(wù)器端交互

這里寫(xiě)圖片描述

服務(wù)器端具體實(shí)現(xiàn)代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket
# 服務(wù)端
def main():
    # 1,創(chuàng)建數(shù)據(jù)報(bào)套接字
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,綁定本地地址,核心是為綁定并公布端口
    # ''表示指定任意ip:0.0.0.0,系統(tǒng)中任意ip的數(shù)據(jù)都可以接收
    myAddr = ('', 8080)
    udpSocket.bind(myAddr)
    # 3,接收客戶端數(shù)據(jù),獲得客戶端的地址(ip和端口號(hào))
    recData, clientAddr = udpSocket.recvfrom(1024)
    print(clientAddr)
    print(recData.decode())
    # 4,回復(fù)客戶端消息
    udpSocket.sendto(recData, clientAddr)
    # 5,關(guān)閉socket
    udpSocket.close()
if __name__ == '__main__':
    main()

echo服務(wù)器端具體實(shí)現(xiàn)代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket
# echo服務(wù)端,回射服務(wù)器,發(fā)過(guò)來(lái),彈回去
# 單進(jìn)程單線程,無(wú)連接
def main():
    # 1,創(chuàng)建數(shù)據(jù)報(bào)套接字
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,服務(wù)端需要綁定:目的是把端口號(hào)和ip地址暴露給別人,讓別人調(diào)用
    # 表示指定任意ip:0.0.0.0,系統(tǒng)中任意ip的數(shù)據(jù)都可以接收
    myAddr = ('', 8080)
    udpSocket.bind(myAddr)
    while True:
        # 3,接收客戶端數(shù)據(jù),獲得客戶端的地址(ip和端口號(hào))
        recData, clientAddr = udpSocket.recvfrom(1024)
        # print(clientAddr)
        print(recData.decode())
        # 4,回復(fù)客戶端消息
        # udpSocket.sendto(recData, clientAddr)
        sendData = input("服務(wù)器!請(qǐng)輸入提供的數(shù)據(jù):")
        udpSocket.sendto(sendData.encode(), clientAddr)
    # 5,關(guān)閉socket
    udpSocket.close()
if __name__ == '__main__':
    main()

客戶端具體實(shí)現(xiàn)代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket
# 客戶端
def main():
    # 1,創(chuàng)建udp類型的socket
    udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2,指定目的地址(ip和端口號(hào)
    serverAddr = ('192.168.105.125', 8080)
    while True:
        # 3,發(fā)送數(shù)據(jù)
        sendData = input("客戶端!請(qǐng)輸入請(qǐng)求數(shù)據(jù):")
        udpSocket.sendto(sendData.encode(), serverAddr)
        # 4,接收數(shù)據(jù)是一個(gè)元組,本次接收數(shù)據(jù)的最大長(zhǎng)度,建議是2^xxx次方
        receData, peerAddr = udpSocket.recvfrom(1024)
        print(receData.decode())
        # print(peerAddr)
    # 5,關(guān)閉socket
    udpSocket.close()
if __name__ == '__main__':
    main()

綁定端口的說(shuō)明:

1,一般情況下,在電腦上運(yùn)行的網(wǎng)絡(luò)程序有很多,而各自用的端口號(hào)很多情況下不知道,為了不與其他的網(wǎng)絡(luò)程序占用同一個(gè)端口號(hào),往往在編程中,udp的端口號(hào)一般不綁定。但是如果需要做成一個(gè)服務(wù)器端的程序的話,是需要綁定的。

2,一個(gè)udp網(wǎng)絡(luò)程序,可以不綁定端口,此時(shí)操作系統(tǒng)會(huì)隨機(jī)進(jìn)行分配一個(gè)端口,如果重新運(yùn)行此程序,端口可能會(huì)發(fā)生變化。

3,一個(gè)udp網(wǎng)絡(luò)程序,也可以綁定信息(ip地址,端口號(hào)),如果綁定成功,那么操作系統(tǒng)用這個(gè)端口號(hào)來(lái)進(jìn)行區(qū)分收到的網(wǎng)絡(luò)數(shù)據(jù)是否是此進(jìn)程的。

UDP網(wǎng)絡(luò)通信過(guò)程 

這里寫(xiě)圖片描述

多線程聊天室服務(wù)器端的實(shí)現(xiàn)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
import socket
from threading import Thread
def task_recv(s):
    while True:
        recvData, peerAddr = s.recvfrom(1024)
        print('子線程接收:ip地址 %s :  消息 %s' % (str(peerAddr), recvData.decode()))
def task_send(s, addr):
    while True:
        sendData = input('親!請(qǐng)?zhí)峁┓祷氐臄?shù)據(jù):')
        s.sendto(sendData.encode(), addr)
def main():
    # 1.創(chuàng)建udp數(shù)據(jù)報(bào)套接字
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2.綁定本地地址,核心是為綁定并公布端口
    myAddr = ('', 8080)  # ''表示指定任意ip 0.0.0.0 系統(tǒng)中任意ip的數(shù)據(jù)都可以接收
    serverSocket.bind(myAddr)
    # 3.主線程收到消息,獲得對(duì)方的ip,port
    recvData, peerAddr = serverSocket.recvfrom(1024)
    print('主線程接收:ip地址 %s :  消息 %s' % (str(peerAddr), recvData.decode()))
    # 4.啟動(dòng)接收消息線程
    thread_recv = Thread(target=task_recv, args=(serverSocket,))
    thread_recv.start()
    # 5.再啟動(dòng)發(fā)送消息的線程,傳遞對(duì)方的ip port
    thread_send = Thread(target=task_send, args=(serverSocket, peerAddr))
    thread_send.start()
    # 6,等待子線程結(jié)束
    thread_recv.join()
    thread_send.join()
if __name__ == "__main__":
    main()

UDP中廣播

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke
from socket import *
def main():
    # 1,創(chuàng)建socket,數(shù)據(jù)報(bào)套接字
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # 2,設(shè)置允許廣播
    # 設(shè)置socket屬性,是否允許廣播,1就是允許
    udp_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    # 3,指定廣播地址(“broadcast”,2425)
    broadcast_addr = ('<broadcast>', 8080)
    # 4,發(fā)送消息,以下以飛秋軟件演示
    send_data = b'1:100:will:will-pc:32:will broadcast'
    udp_socket.sendto(send_data, broadcast_addr)
    udp_socket.close()
if __name__ == '__main__':
    main()

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 保留已有python安裝Anaconda的方法推薦

    保留已有python安裝Anaconda的方法推薦

    在安裝Anaconda之前,有的已經(jīng)安裝過(guò)一個(gè)Python版本了,但是又不想刪除這個(gè)Python版本,該怎么辦呢??這篇文章主要給大家介紹了關(guān)于保留已有python安裝Anaconda的幾種法推薦,需要的朋友可以參考下
    2023-12-12
  • 詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程

    詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程

    這篇文章主要介紹了詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python 序列解包的多種形式及用法解析

    python 序列解包的多種形式及用法解析

    這篇文章主要介紹了python 序列解包的多種形式及用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • GPU排隊(duì)腳本實(shí)現(xiàn)空閑觸發(fā)python腳本實(shí)現(xiàn)示例

    GPU排隊(duì)腳本實(shí)現(xiàn)空閑觸發(fā)python腳本實(shí)現(xiàn)示例

    有的服務(wù)器是多用戶使用,GPU的資源常常被占據(jù)著,很可能在夜間GPU空閑了,但來(lái)不及運(yùn)行自己的腳本。如果沒(méi)有和別人共享服務(wù)器的話,自己的多個(gè)程序想排隊(duì)使用GPU,也可以用這個(gè)腳本
    2021-11-11
  • Python學(xué)習(xí)筆記之變量、自定義函數(shù)用法示例

    Python學(xué)習(xí)筆記之變量、自定義函數(shù)用法示例

    這篇文章主要介紹了Python學(xué)習(xí)筆記之變量、自定義函數(shù)用法,結(jié)合實(shí)例形式分析了Python變量、自定義函數(shù)的概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • Python selenium的這三種等待方式一定要會(huì)!

    Python selenium的這三種等待方式一定要會(huì)!

    今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著selenium三種等待方式展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • python-web根據(jù)元素屬性進(jìn)行定位的方法

    python-web根據(jù)元素屬性進(jìn)行定位的方法

    這篇文章主要介紹了python-web根據(jù)元素屬性進(jìn)行定位的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)給PDF添加水印的方法

    Python實(shí)現(xiàn)給PDF添加水印的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)給PDF添加水印的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python 內(nèi)置變量和函數(shù)的查看及說(shuō)明介紹

    Python 內(nèi)置變量和函數(shù)的查看及說(shuō)明介紹

    今天小編就為大家分享一篇Python 內(nèi)置變量和函數(shù)的查看及說(shuō)明介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python3中延時(shí)變量和 free_list鏈表的區(qū)別解析

    Python3中延時(shí)變量和 free_list鏈表的區(qū)別解析

    這篇文章主要介紹了Python3中延時(shí)變量和 free_list鏈表的區(qū)別,在Python3中,"延時(shí)變量" 和 "free_list鏈表" 是兩個(gè)不同的概念,他們之間沒(méi)有直接聯(lián)系,本文給實(shí)例相結(jié)合給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-04-04

最新評(píng)論