使用python实现UDP通信方式

目录
  • python UDP通信
  • 对UDP协议的理解
    • Socket简介
    • UDP特点
    • UDP中客户端和服务器端交互
    • UDP网络通信过程
    • 多线程聊天室服务器端的实现
    • UDP中广播

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()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python实现一个简单的udp通信的示例代码

    什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. python创建套接字 socket.socket([family[, type[, proto]]]) 参数解析: family: AF_UNIX(适用跨机通信) 或 AF_INET(IPv4)(适用本机通信) type: 套接字类型,可以根据是面向连接的还是非连接分为 SOCK_STREAM(TCP) 或 SO

  • Python制作简易聊天器,搭建UDP网络通信模型

    目录 1.导入模块 2.创建一个套接字对象 3.发送数据到ubuntu系统中 4.发送任意数据给网络条数助手 5.循环发送数据 6.循环接受数据 循环接收 将相关的功能抽离出来做成一个函数 7.启动 最后运行代码 前言: 互联网的本质是什么?其实就是信息的交换.就比如我们常用的QQ.微信等.那么如何将自己的信息发送到其他人的电脑上呢? 那就需要借助网络模型来完成这样的事情了.今天就带领大家使用UDP网络模型来完成一个简单的聊天器 分享内容: python中的套接字实现 如何与Ubuntu建立通信

  • Python基于socket模块实现UDP通信功能示例

    本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import socket #使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口和端口号,空字符串表示本机任何可用IP地址 s.bind(('', 5000)) while True: data, addr=s.recvfrom(1024) #显示接收到的内容 print(

  • python 基于UDP协议套接字通信的实现

    一.UPD实现单用户通信 服务端: ''' from socket import * server=socket(AF_INET,SOCK_DGRAM) - 这里代指的是一种数据报协议,数据报协议指的就是udp协议(补充: 数据报就是自己utp协议中有自己的头,有自己的数据部分) server.bind('IP', PORT) bytes类型的数据, client_addr = server.recvfrom(1024) - client_addr是一个2元组的形式: 第一个参数是客户端的IP地

  • Python socket模块实现的udp通信功能示例

    本文实例讲述了Python socket模块实现的udp通信功能.分享给大家供大家参考,具体如下: socket介绍 socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是: 它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等. 模拟udp_socket客户端(发送端):udp_client.py #coding=utf-8 import socket # 获

  • python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

    UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议.在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议. 下面是用python实现UDP服务器的代码: 复制代码 代码如下: #!/usr/bin/env pythonimport socketaddress=('127.0.0.1',10000)s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind

  • Python实现UDP程序通信过程图解

    运行流程:编辑好代码后,通过cmd打开文件执行.例:C:\Users\小李酷少>C:\Users\小李酷少\Desktop\发送端.py hello 易见问题:在运行程序的时候容易出现"请求的地址无效"的情况: 这是因为在编辑代码时候输入的ip地址不正确. 解决方法: 打开cmd,输入ipconfig,查看本机ip地址.如下图 之后在代码行修改为正确的IP地址就好啦. 1.代码 (1)接收端代码: import socket #使用IPV4协议,使用UDP协议传输数据 s=soc

  • 使用python实现UDP通信方式

    目录 python UDP通信 对UDP协议的理解 Socket简介 UDP特点 UDP中客户端和服务器端交互 UDP网络通信过程 多线程聊天室服务器端的实现 UDP中广播 python UDP通信 1.打开虚拟通信程序,选择UDP通信并选定收发数据的ip地址和port端口: 2.在虚拟机中编写python程序与主机中的虚拟通信程序实现数据传输: # 注释的标注格式为:每行开头则直接输入#并空一格开始注释 # 若在每行代码后面加注释,则空两格输入#再空一格开始注释 import socket #

  • python实现udp数据报传输的方法

    本文实例讲述了Python实现UDP数据报传输的方法,非常具有实用价值.分享给大家供大家参考.具体方法分析如下: 服务端代码: import socket port = 8081 s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #从给定的端口,从任何发送者,接收UDP数据报 s.bind(("",port)) print 'waiting on port:',port while True: data,addr = s.recvf

  • 使用python编写udp协议的ping程序方法

    服务器端 import random from socket import * serverSocket = socket(AF_INET, SOCK_DGRAM)#建立udp协议的socket连接 serverSocket.bind(('', 12000)) while True: rand = random.randint(0, 10)#生成随机数,模拟udp环境下的丢包 message, address = serverSocket.recvfrom(1024)#接收客户端发送的信息,应该

  • python使用udp实现聊天器功能

    聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: •在一个电脑中编写1个程序,有2个功能 •1.获取键盘数据,并将其发送给对方 •2.接收数据并显示 •并且功能数据进行选择以上的2个功能调用 例子程序如下: import socket def send_message(udp_socket): # 输入对方的ip/port dest_ip = input("请输入对方的ip:") dest_port = int(input("请输入对象的port:"))

  • 实现Python与STM32通信方式

    断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官网找了一下 ,附上官网pyserial档链 接:https://pyserial.readthedocs.io/en/latest/pyserial.html#overview 首先在windows的CMD命令管理器中安装pyserial,直接在CMD中键入如下字符 pip install pyserial 再将

  • python实现UDP协议下的文件传输

    本文实例为大家分享了python实现UDP文件传输的具体代码,供大家参考,具体内容如下 UDP协议下文件传输: 服务端 import socket count = 0 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_addr = ('127.0.0.1',9999) s.bind(server_addr) print('Bind UDP on 9999...') while True: if count == 0: data

  • python实现udp传输图片功能

    本文实例为大家分享了python实现udp传输图片的具体代码,供大家参考,具体内容如下 首先要了解UDP的工作模式 对于服务器,首先绑定IP和端口,本机测试的时候可以使用127.0.0.1是本机的专有IP,端口号 大于1024的是自定义的,所以用大于1024的端口号,然后接收客户端数据,处理,返回 对于客户端,UDP不用建立连接,只管发送不管接收到没有,所以可以直接对服务器的IP地址和端口号发送信息,然后等待应答. 注意传输的数据是二进制流数据,所以要找方法把需要传输的数据编码成二进制码流,传过

  • Python使用UDP实现720p视频传输的操作

    1. 项目背景 视频传输: 在一台电脑上播放视频(捕捉摄像头画面),同局域网内另一台电脑上实时播放,尽量不卡顿. 先放最后的照片,和用gif展示一下视频效果. 传输视频可以采取图片或者流的形式,本文采取传输图片的形式,在1s之内显示多张图片从而形成连续的视频画面. 经费有限,所有实验均基于笔记本电脑. 使用的视频源是本机摄像头,以及进击的巨人720p资源. 2. 解决方案 1. 使用Python的Socket,使用opencv捕捉摄像头/视频的画面. 2. 原始的图片很大(720p的大小是192

  • 对python中UDP,socket的使用详解

    讲到UDP和TCP之前咱们先了解一下socket Socket socket简称套接字,是进程间通信的一种方式.与其他的方式的进程间的通讯的方式不同的是,socket是实现了主机间进程间的通讯.我们网络上的各种服务都是基于socket来完成的.例如QQ.微信. 怎么样创建socket呢. 创建一个tcpsocket: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 创建一个UDP类型的socket; # # 创建套接字 # udpSock

随机推荐