使用python实现UDP通信方式
作者:skye_fly 发布时间:2021-09-19 13:48:35
python UDP通信
1.打开虚拟通信程序,选择UDP通信并选定收发数据的ip地址和port端口:
2.在虚拟机中编写python程序与主机中的虚拟通信程序实现数据传输:
# 注释的标注格式为:每行开头则直接输入#并空一格开始注释
# 若在每行代码后面加注释,则空两格输入#再空一格开始注释
import socket
# 使用udp收发数据
def main():
# 1.创建socket套接字
udp_socket = socket.socket(socket.AF_INET, sock.SOCK_DGRAM) # AF_INET表示使用ipv4,默认不变,SOCK_DGRAM表示使用UDP通信协议
# 2.绑定端口port
local_addr = ("", 7878) # 默认本机任何ip ,指定端口号7878
udp_socket.bind(local_addr) # 绑定端口
# 3.收发数据
send_data = input("请输入您想要发送的数据:" )
udp_socket.sendto(send_data.encode("utf-8"), ("10.80.34.68", 8080)) # 编码成全球统一数据格式,用元组表示接收方ip和port
recv_data = udp_socket.recvfrom(1024) # 定义单次最大接收字节数
# 4.打印数据
recv_msg = recv_data[0] # 接收的元组形式的数据有两个元素,第一个为发送信息
send_addr = recv_data[1] # 元组第二个元素为发信息方的ip以及port
print ("收到的信息为:", recv_msg.decode("gbk")) # 默认从windows发出的数据解码要用”gbk”,保证中文不乱码
print ("发送方地址为:", str(send_addr)) # 强转为字符串输出地址,保证不乱码
# 5.关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
对UDP协议的理解
Socket简介
网络中进程之间如何通信
1,在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。
2,TCP/IP协议族已经帮我们解决了这个问题,即:网络层的ip地址可以唯一标识网络中的主机;而传输层的:协议+端口,可以唯一标识主机中的应用程序(进程)。
3,利用ip地址,协议,端口,就可以标识网络的进程了,网络中的进程通信就可以利用这个标识与其他进程进行交互。
什么是Socket?
socket,简称:套接字,是进程间通信的一种方式。socket与其他进程间的通信方式不同在于:它能实现不同主机间的进程间通信。例如:QQ聊天、浏览网页、收发Email等等。
创建Socket
在Python中socket模块的函数socket:
socket.socket(AddressFamily,Type)
加以说明:
函数socket.socket创建一个socket,返回一个socket。
AddressFamily:选择AF_INET用于网络中进程间通信或者AF_UNIX用于同一台机器进程间通信,实际工作中常用AF_INET。
Type:套接字类型,可以是SOCK_STREAM,流式套接字,主要用于tcp协议或者SOCK_DGRAM,数据报套接字,主要用于udp协议。
#import socket
# udp:sock_dgram:数据报套接字
# udpSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
#
#
# tcp:sock_stream:流式套接字
# tcpSocket = socket(AF_INET, SOCK_STREAM)
UDP特点
UDP:用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP:是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。
UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
UDP一般用于多点通信和实时的数据业务。例如:语音广播、QQ、视频会议系统等。
UDP中客户端和服务器端交互
UDP中客户端和服务器端交互
服务器端具体实现代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : xiaoke
import socket
# 服务端
def main():
# 1,创建数据报套接字
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2,绑定本地地址,核心是为绑定并公布端口
# ''表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收
myAddr = ('', 8080)
udpSocket.bind(myAddr)
# 3,接收客户端数据,获得客户端的地址(ip和端口号)
recData, clientAddr = udpSocket.recvfrom(1024)
print(clientAddr)
print(recData.decode())
# 4,回复客户端消息
udpSocket.sendto(recData, clientAddr)
# 5,关闭socket
udpSocket.close()
if __name__ == '__main__':
main()
echo服务器端具体实现代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : xiaoke
import socket
# echo服务端,回射服务器,发过来,弹回去
# 单进程单线程,无连接
def main():
# 1,创建数据报套接字
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2,服务端需要绑定:目的是把端口号和ip地址暴露给别人,让别人调用
# 表示指定任意ip:0.0.0.0,系统中任意ip的数据都可以接收
myAddr = ('', 8080)
udpSocket.bind(myAddr)
while True:
# 3,接收客户端数据,获得客户端的地址(ip和端口号)
recData, clientAddr = udpSocket.recvfrom(1024)
# print(clientAddr)
print(recData.decode())
# 4,回复客户端消息
# udpSocket.sendto(recData, clientAddr)
sendData = input("服务器!请输入提供的数据:")
udpSocket.sendto(sendData.encode(), clientAddr)
# 5,关闭socket
udpSocket.close()
if __name__ == '__main__':
main()
客户端具体实现代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : xiaoke
import socket
# 客户端
def main():
# 1,创建udp类型的socket
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2,指定目的地址(ip和端口号
serverAddr = ('192.168.105.125', 8080)
while True:
# 3,发送数据
sendData = input("客户端!请输入请求数据:")
udpSocket.sendto(sendData.encode(), serverAddr)
# 4,接收数据是一个元组,本次接收数据的最大长度,建议是2^xxx次方
receData, peerAddr = udpSocket.recvfrom(1024)
print(receData.decode())
# print(peerAddr)
# 5,关闭socket
udpSocket.close()
if __name__ == '__main__':
main()
绑定端口的说明:
1,一般情况下,在电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定。但是如果需要做成一个服务器端的程序的话,是需要绑定的。
2,一个udp网络程序,可以不绑定端口,此时操作系统会随机进行分配一个端口,如果重新运行此程序,端口可能会发生变化。
3,一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区分收到的网络数据是否是此进程的。
UDP网络通信过程
多线程聊天室服务器端的实现
#!/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('亲!请提供返回的数据:')
s.sendto(sendData.encode(), addr)
def main():
# 1.创建udp数据报套接字
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定本地地址,核心是为绑定并公布端口
myAddr = ('', 8080) # ''表示指定任意ip 0.0.0.0 系统中任意ip的数据都可以接收
serverSocket.bind(myAddr)
# 3.主线程收到消息,获得对方的ip,port
recvData, peerAddr = serverSocket.recvfrom(1024)
print('主线程接收:ip地址 %s : 消息 %s' % (str(peerAddr), recvData.decode()))
# 4.启动接收消息线程
thread_recv = Thread(target=task_recv, args=(serverSocket,))
thread_recv.start()
# 5.再启动发送消息的线程,传递对方的ip port
thread_send = Thread(target=task_send, args=(serverSocket, peerAddr))
thread_send.start()
# 6,等待子线程结束
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,创建socket,数据报套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2,设置允许广播
# 设置socket属性,是否允许广播,1就是允许
udp_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
# 3,指定广播地址(“broadcast”,2425)
broadcast_addr = ('<broadcast>', 8080)
# 4,发送消息,以下以飞秋软件演示
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()
来源:https://blog.csdn.net/skye_fly/article/details/108645935


猜你喜欢
- [概 要] 这篇文章讨论常用的"sql注入"技术的细节,应用于流行的Ms IIS/ASP/SQL-Server平台。这里
- 前言为什么要引用单元测试类传统方法的缺点分析不方便,我们需要在main函数中去调用,这样就需要去修改main函数,如果现在项目正在运行,就可
- 以前有过一篇类似的文章, 讲的比较简单只有三个插件而已, 所以这篇文章将全持续更新.jQuery UI 大名顶顶, 不用介绍, 它的各个控件
- 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下。在命令行模式下,可以执行
- 注:本文的所有数据请移步—— 参考数据一、水平堆叠图堆叠图其实就是柱状图的一种特殊形式fr
- 知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的。每次我需要做任何关于web的自动任务时,我都使用这段python
- 本文转自微信公众号:"算法与编程之美" Python用HBuilder创建交流社区APP 基于P
- 实现一个优先级队列,每次pop的元素要是优先级高的元素,由于heapq.heapify(list)默认构建一个小顶堆,因此要将priorit
- 观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思
- 那里都有狭窄的空间:网页横幅、新闻标题处的空间、柱状的广告,但一张来自照相机的照片却要大很多,它们的比例一般是 6 × 4 英寸 。你如何处
- 踩坑记录:用pandas来做csv的缺失值处理时候发现奇怪BUG,就是excel打开csv文件,明明有的格子没有任何东西,当然,我就想到用p
- 如何对设计进行评判,一定有很多答案,有利有弊。问100位设计师,会得到100种回答。用线上PV、UV等数据说话,更多受产品属性、运营动作影响
- 1.算法:(设查找的数组期间为array[low, high])(1)确定该期间的中间位置K(2)将查找的值T与array[k]比较。若相等
- 可以把本功能写成一个函数,函数的处理过程描述如下:首先调用adodb.connection对象中的openSchema函数,这样会得到一个R
- 查询mysql的操作信息show status -- 显示全部mysql操作信息show status like "com_ins
- 本篇主要记录的是利用javscript实现一个网页计算器的效果,供大家参考,具体内容如下话不多说,代码如下:首先是html的代码:<!
- MySQL数据库是一款非常好用的数据库管理系统,但是相对来说卸载起来麻烦一些这里给大家分享下MySQL数据库如何卸载干净~1 停止MySQL
- Oracle RAC提供两种方式实现负载均衡,第一种是纯技术手段,即在用户连接时,根据系统当前的负载情况决定由哪个节点处理用户请求;第二种是
- 1.经典类与新式类在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style
- 如何显示数据库里的图片?asp调用数据库中的图片并显示。怎样把数据库里的图片显示出来?我们以gif格式的图片为例,代码如下:showimag