Python 实现基于UDP协议的局域网广播

组播与广播详解及Python实现 广播是一种数据传输方式,数据包从一个源发送到网络中所有节点。广播是网络中的一对多通信方式,所有处于同一网络段的设备都能接收到广播数据包。组播是一种数据传输方式,数据包从一个源发送到网络中一组特定的节点(即一个组),而不是所有节点。组播是一对多的通信方式,但仅限于加入该组播组的接收者。 阅读详情

一、发送端。

f.py,源码如下:

from time import sleep
from os import startfile
from zlib import compress
from threading import Thread
from socket import (socket,AF_INET,SOCK_DGRAM,SOL_SOCKET,SO_BROADCAST)
from tkinter import Tk,BooleanVar,Button,Label
from PIL.ImageGrab import grab
root = Tk()
root.title("屏幕广播发送端-小6哥")
# 初始尺寸和位置
root.geometry('320x60+500+209')
#两个方向都不允许缩放
root.resizable(False,False)
#缓冲区大小
BUFFER_SIZE = 60*1024
#控制是否正在发送的变量
sending = BooleanVar(root,value=False)
def send_image():
    sock = socket(AF_INET,SOCK_DGRAM)
    # 广播
    sock.setsockopt(SOL_SOCKET,SO_BROADCAST,True)
    IP ='255.255.255.255'# 发送地址为<广播>
    serverPort = 22222# 请自行选择
    
    # Windows系统因为特殊的原因要多一些代码
    import platform
    if platform.system() == 'Windows':
        with socket(AF_INET, SOCK_DGRAM) as c:
            c.connect(('114.114.114.114', 80))
            local_ip = c.getsockname()[0]
            sock.bind((local_ip, serverPort))
    
    while sending.get():
        # 屏慕截图
        im = grab()
        w, h = im.size
        # 把图像转换为字节串,压缩后传输,减少带宽占用
        im_bytes = compress(im.tobytes())
        # 通知大家开始发送一幅图像
        sock.sendto(b'start',(IP,serverPort))
        #分块发送,以免字节串太长无法发送
        for i in range(len(im_bytes)//BUFFER_SIZE+1):
            start = i * BUFFER_SIZE
            end = start + BUFFER_SIZE
            sock.sendto(im_bytes[start:end],(IP,serverPort))
            # 通知大家已发送完一幅图像
        sock.sendto(b'_over'+str((w,h)).encode(),(IP,serverPort))
        #0.5秒截图发送一次
        sleep(0.5)
    sock.sendto(b'close',(IP,serverPort))
    sock.close()
lbCopyRight = Label(root,text='小6哥开发,关注微信公众号“暂无”查看源码识',fg='red',cursor='plus')
lbCopyRight.place(x=5,y=5,width=310,height=20)
url = r'https://blog.youkuaiyun.com/liujava56?spm=1011.2266.3001.5343'
lbCopyRight.bind("<Button-1>",lambda e: startfile(url))
def btnStartClick():
    sending.set(True)
    Thread(target=send_image).start()
    btnStart['state'] = 'disabled'
    btnStop['state'] = 'normal'
btnStart = Button(root,text='开始广播',command=btnStartClick)
btnStart.place(x=30,y=30,width=125,height=20)
def btnStopClick():
    sending.set(False)
    btnStart['state'] = 'normal'
    btnStop['state'] ='disabled'
btnStop = Button(root,text='停止广播',command=btnStopClick)
btnStop['state'] ='disabled'
btnStop.place(x=165,y=30,width=125,height=20)

root.mainloop()

二、接收端

s.py,源码如下:

from time import sleep
from os import startfile
from zlib import decompress
from threading import Thread
from tkinter import Tk,Canvas,BOTH,YES,Label
from socket import socket,AF_INET,SOCK_DGRAM
from PIL.Image import frombytes
from PIL.ImageTk import PhotoImage
#url = r'https://blog.youkuaiyun.com/liujava56?spm=1011.2266.3001.5343'
#startfile(url)
root = Tk()
root.title('屏幕广播接收端-小6哥-微信公众号“暂无”')
root.geometry('800x600+0+0')
# root.overrideredirect(True)
root.attributes('-topmost',True)
#使用Labe1显示图像,自带双缓冲,避免图像闪烁
lbImage = Label(root)
lbImage.pack(fill=BOTH,expand=YES)
BUFFER_SIZE = 60 *1024
data =[]
def show_image(image_bytes, image_size):
    #窗口尺寸
    screen_width = root.winfo_width()
    screen_height = root.winfo_height()
    # 必须使用全局变量,否则会不显示图像
    global im
    #重建图像,如果接收图像数据不完整就直接放弃
    try:
        im = frombytes('RGB',image_size,image_bytes)
    except:
        return
    # 显示图像
    im = im.resize((screen_width,screen_height))
    im = PhotoImage(im)
    lbImage['image'] = im
    lbImage.image = im
def recv_image():
    global receiving,im
    # 创建UDP套接字,绑定用来接收屏幕广播的端口
    sock = socket(AF_INET,SOCK_DGRAM)
    serverPort = 22222
    sock.bind(('',serverPort))
    
    while receiving:
        # 开始接收图像数据
        try:
            chunk,_= sock.recvfrom(BUFFER_SIZE)
        except:
            # 收到不完整图像,直接丢弃
            data.clear()
            continue
        # 等待接收开始标志
        # 防止半路加入的客户端从中间开始接收,导致图像不完整
        # 收到开始标志
        if chunk == b'start':
            data.clear()
            continue
        #一幅图像传输结束,重建图像并显示
        elif chunk.startswith(b'_over'):
            image_size = eval(chunk[5:])
            try:
                image_data = decompress(b''.join(data))
            except:
                # 收到不完整图像,直接丢弃
                data.clear()
                continue
            
            global thread_show
            # 创建线程并启动
            thread_show = Thread(target=show_image,args=(image_data,image_size))
            thread_show.daemon =True
            thread_show.start()
            
            data.clear()
            continue
        elif chunk == b'close':
            #receiving = False
            #sock.close()
            sleep(0.1)
            #root.destroy()
        data.append(chunk)

receiving = True
thread_sender = Thread(target=recv_image)
thread_sender.daemon = True
thread_sender.start()

#退出程序时,如果正在接收就停止接收再退出,保证线程安全
def close_window():
    global receiving
    receiving = False
    sleep(0.3)
    root.destroy()
root.protocol('WM_DELETE_WINDOW',close_window)
root.mainloop()

python实现发送局域网广播并且接收端持续接收广播 【代码】python实现发送局域网广播并且接收端持续接收广播。 阅读详情

相关推荐

Python的网络广播消息包发送接收工作原理和代码

• 发送广播时,数据包的目标 IP 通常是类似 255.255.255.255(全网广播)或者 192.168.1.255(局域网内特定网络广播)这种广播地址。此时,先运行接收端代码,让其处于监听广播消息的状态,再运行发送端代码发送广播消息,接收端就能接收到发送的广播消息并在终端打印出来了。但在接收广播消息时,只需要确保你的套接字绑定到正确的端口和网络接口即可,不需要显式启用广播选项。这个选项在接收端是无效的,因为广播数据包的接收是由网络接口驱动和操作系统处理的,和套接字选项无关。以下是修改后的不使用。

997

python之UDP广播

python之UDP广播

qq_16740151的专栏 1574

【FPGA】AD9694调试注意事项

基于FPGA的AD9694设计及其注意事项,包括同步的设计注意事项

weixin_41246509的博客 2910

Python实现UDP广播

服务器端和正常服务器端实现相同: import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) PORT = 1060 s.bind(('', PORT)) print('Listening for broadcast at ', s.getsockname()) while True: data, ad

我惠依旧的博客 6049

SAP采购订单中项目类别B(限制)的控制逻辑

在笔者所在企业中,框架类采购订单中项目类别需要选择B(限制)。今天笔者从比较全面的角度分析了一下这个项目类别B到底可以决定些什么?控制到什么?先从后台SPRO中打开相应的配置菜单。 打开项目类别B之后,可以看到一些配置信息,这里有一点与其它配置不同的地方,即无法新增项目,也无法修改现有项目。这个疑惑今后再去解决吧。当前只研究项目类别B的控制逻辑。 下面就参考上图中的配置分段来分析和测试其控制逻辑, 1、如项目类别配置图,所需材料值为不允许;经测试,如下图在采购订单创建时,不能输入物料编号条目。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6034

K-Means聚类算法 — 算法原理、质心计算、距离度量、聚类效果评价及优缺点

分类知识   分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中。机器学习中常见的分类算法有:SVM(支持向量机)、KNN(最邻近法)、Decision Tree(决策树分类法)、Naive Bayes(朴素贝叶斯分类)、Neural Networks(神经网络法)等。   但当对海量数据进行分类时,为了降低数据满足分类算法要求所需要的预处理代价,往往需要选...

zhf的博客 1万+

Python使用UDP协议实现局域网内屏幕广播

推荐图书:《Python可以这样学》,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷图书详情(京东):董付国老师所有图书均提供配套教学资源。==========...

Python小屋 2302

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 676

python+soket实现UDP协议的局域网广播程序

1 # udp_gb_server.py 2 '''服务端(UDP协议局域网广播)''' 3 4 import socket 5 6 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 7 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, ...

derek881122的博客 219

在abaqus中利用point-based 来快捷定义螺栓连接

abaqus中可以通过point-based方式定义连接点的位置,并对连接方式进行定义,可以进行螺栓连接的模拟。 可以通过逐点输入坐标或导入外部的坐标位置 也可以通过阵列的方式定义点 定义完点后就利用create fasteners,选择point-based,选取刚才创建好的点阵列,然后定义连接的属性,如下图 定义connector section时,类型选择translator,相当于只有1方向可以动,定义弹性模量以及破坏准则。 案例操作 假如有两个板,通过...

fiber_tape的博客 7345

Centos 7 Linux 安装 JDK 8:下载、安装、配置环境变量、验证

本文详细介绍了在 CentOS 7 系统上手动安装 JDK 8 的完整流程,包括环境准备、JDK 安装包下载与上传、解压安装、配置全局环境变量,以及最终的验证步骤。适用于使用 VMware 虚拟机、云服务器或物理机的 CentOS 7 用户,操作清晰、步骤完整,帮助开发者快速搭建 Java 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2584

python udp广播_Python+Socket实现基于UDP协议的局域网广播功能示例

本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下:服务器端:# udp_gb_server.py'''服务端(UDP协议局域网广播)'''import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socke...

weixin_39830225的博客 648

大数据知识面试题-通用(2026版)

序列号 内容 链接 1 大数据知识面试题-通用(2022版) 待续… 2 大数据知识面试题-Hadoop(2022版) 待续… 3 大数据知识面试题-MapReduce和yarn(2022版) 待续… 4 大数据知识面试题-Zookeepr (2022版) 待续… 5 大数据知识面试题-Hive (2022版) 待续… 6 大数据知识面试题-Flume(2022版) 待续… 7 大数据知识面试题-Hbase(2022版) 待续… 8 大数据知识面试题-sqoop(....

拉格朗日的学习笔记 2万+

python socket udp 广播,Python+Socket实现基于UDP协议的局域网广播功能示例

本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下:服务器端:# udp_gb_server.py'''服务端(UDP协议局域网广播)'''import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socke...

weixin_33377602的博客 383

传统(经典)粒子群算法(PSO)解决单目标优化问题

智能算法:粒子群算法(particle swarm optimizer)—PSO %原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度) % (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数 % (3)对于每个粒子,使用它的适应度值fit[i]和个体的极值pbest(i)进行比较,如果fit[i]>pbest(i),则pbest(i)=fit[i] % (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则

weixin_51631044的博客 1295

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python udp 直播_Python+Socket实现基于UDP协议的局域网广播功能示例

本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下:服务器端:# udp_gb_server.py'''服务端(UDP协议局域网广播)'''import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socke...

weixin_39947501的博客 209

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

openwrt udp服务器_Python使用UDP协议实现局域网内屏幕广播

推荐图书:《Python可以这样学》,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷图书详情(京东):董付国老师所有图书均提供配套教学资源。==============3年前推送过一篇使用TCP协议进行局域网内屏幕广播的文章,见Python实现局域网内屏幕广播的技术要点分析众所周知,TCP协议尽管有良好的流量控制、拥塞控制等传输质量保证机制,但开销比较大且只能单...

weixin_39616416的博客 711

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python 局域网广播_python+soket实现UDP协议的局域网广播程序

1 # udp_gb_server.py2 '''服务端(UDP协议局域网广播)'''34 import socket56 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)7 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)89 PORT = 10601011 network = ...

weixin_35045900的博客 237

python+soket实现UDP协议的局域网广播

# udp_gb_server.py '''服务端(UDP协议局域网广播)''' import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) PORT = 1060 network = '<broadcast>' s.sendto('Client broadcast message!'.encode('u

qq_35306993的博客 444

python基于udp的网络聊天室_实例详解Python+Socket实现基于UDP协议的局域网广播功能...

这篇文章主要介绍了Python+Socket实现基于UDP协议的局域网广播功能,结合实例形式分析了Python+socket实现UDP协议广播的客户端与服务器端功能相关操作技巧,需要的朋友可以参考下本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下:服务器端:# udp_gb_server.py'''服务端(UDP协议局域网广播)'''imp...

weixin_39947306的博客 456

老主板改造:华硕P8B75-V BIOS注入NVMe支持全攻略

NVMe固态硬盘凭借PCIe通道的高带宽,成为提升电脑存储性能的主流方案。然而,许多老旧主板(如华硕P8B75-V)的UEFI BIOS仅内置传统AHCI驱动,无法直接识别NVMe设备,导致升级受阻。通过向BIOS固件中注入NvmExpressDxe驱动模块,并配合PCIe转M.2转接卡,即可让老平台突破SATA接口的速度限制,实现从NVMe硬盘开机引导。这一技术方案涉及固件备份、模块插入、刷写设置等关键环节,既能延长旧硬件生命周期,也是低成本改造的典型实践。对于希望老平台焕发新生的用户,掌握这一方法可以显

weixin_34174422的博客 503

python 局域网广播_Python+Socket实现基于UDP协议的局域网广播功能示例

本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能。分享给大家供大家参考,具体如下:服务器端:# udp_gb_server.py'''服务端(UDP协议局域网广播)'''import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET, socke...

weixin_39574140的博客 276

python udp 直播_Python使用UDP协议实现局域网内屏幕广播

3年前推送过一篇使用TCP协议进行局域网内屏幕广播的文章,见众所周知,TCP协议尽管有良好的流量控制、拥塞控制等传输质量保证机制,但开销比较大且只能单播。尽管当时的设计中结合了多线程技术,在局域网内机器多的时候仍有一定的延迟,并且教师机压力较大。本文使用UDP协议重新实现这一功能,虽然UDP协议没有流量控制等QoS保障技术,但能够进行广播,这一点能给教师机减轻大部分压力。虽然确实有丢包的可能,但在...

weixin_39727934的博客 439
上一篇: Python 合成多张图片到PDF格式
下一篇: python 截图小工具
小6哥
博客等级 码龄18年 16粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值