1、udp介绍

UDP --- 用户数据报协议, 是一个无连接的简单的面向数据报的传输层协议。 UDP不提供可靠性, 它只是把应用程序传给IP层的数据报发送出去, 但是并不能保证它们能到达目的地。 由于UDP在传输数据报前不用在客户和服务器之间建立一个连接, 且没有超时重发等机制, 故而传输速度很快。

UDP是一种面向无连接的协议, 每个数据报都是一个独立的信息, 包括完整的源地址或目的地址, 它在网络上以任何可能的路径传往目的地, 因此能否到达目的地, 到达目的地的时间以及内容的正确性都是不能被保证的。

【 适用情况】

UDP是面向消息的协议, 通信时不需要建立连接, 数据的传输自然是不可靠的, UDP一般用于多点通信和实时的数据业务, 比如:

  • 语音广播
  • 视频
  • QQ
  • TFTP(简单文件传送)
  • SNMP( 简单网络管理协议)
  • RIP( 路由信息协议, 如报告股票市场, 航空信息)
  • DNS(域名解释)

UDP操作简单, 而且仅需要较少的监护, 因此通常用于局域网高可靠性的分散系统中client/server应用程序。 例如视频会议系统, 并不要求音频视频数据绝对的正确, 只要保证连贯性就可以了, 这种情况下显然使用UDP会更合理一些。

2、udp网络程序-发送数据

创建一个udp客户端程序的流程是简单, 具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字
from socket import *
#1.创建套接字
udpSocket = socket(AF_INET,SOCK_DGRAM)
#2.准备接收方的地址
sendAddr = ('192.168.1.103',7777)
#3.从键盘获取数据
sendData = input('请输入要发送的数据:')
#4发送数据到指定的电脑上
udpSocket.sendto(sendData.encoding('utf-8'),sendAddr)
#5.关闭套接字
udpSocket.ckose()

3、udp网络程序-接收数据

from socket import *
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 准备接收方的地址
sendAddr = ('192.168.1.103', 7777)
#3. 从键盘获取数据
sendData = input("请输入要发送的数据:")
#4. 发送数据到指定的电脑上
udpSocket.sendto(sendData.encoding('utf-8'), sendAddr)
#5. 等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
#6. 显示对方发送的数据
print(recvData)
#7. 关闭套接字
udpSocket.close()

4、udp网络程序-端口问题

重新运行多次脚本端口会发生改变,原因在于, 当重新运行时, 如果没有确定到底用哪个, 系统默认会随机分配

端口唯一标识这个程序,如果其他电脑上的网络程序如果想要向此程序发送数据, 那么就需要向这个端口标识的程序发送即可

5、udp绑定信息

如果需要做成一个服务器端的程序的话,端口号是需要绑定的

from socket import *
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 绑定本地的相关信息, 如果一个网络程序不绑定, 则系统会随机分配
bindAddr = ('', 7788) # ip地址和端口号, ip一般不用写, 表示本机的任何一个ip
udpSocket.bind(bindAddr)
#3. 等待接收对方发送的数据
# 返回一个元组(数据字节,(发送放的ip,port))
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最⼤字节数
#4. 处理数据
msg = recvData[0].decode('gbk')
ip = recvData[1][0]
port = recvData[1][1]
#5. 显示接收到的数据
myMsg = '【Receive from %s : %s】:%s'%(ip,port,msg)
print(myMsg)
#6. 关闭sockcet
myUDP.close()

总结

一个udp网络程序, 可以不绑定, 此时操作系统会随机进行分配一个端口, 如果重新运行次程序端口可能会发生变化

一个udp网络程序, 也可以绑定信息( ip地址, 端口号) , 如果绑定成功, 那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的

6、udp网络通信过程

7、udp应用: echo服务器

Echo服务是一种非常有用的用于调试和检测的工具。这个协议的作用也十分简单,接收到什么原封发回就是了。

from socket import *
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.绑定本地的相关信息
bindAddr = ('', 7777) #ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udpSocket.bind(bindAddr)
num = 1
while True:
#3.等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) #1024表示本次接收的最大字节数
#4.将接收到的数据再发送给对方
udpSocket.sendto(recvData[0], recvData[1])
#recvData是一个元组,[0]是元组中的第一个元素,存的是接收到的消息,
#[1]是第二个元素,消息的来源,即发送方的IP地址和端口号 #5. 统计信息
print('已经将接收到的第%d个数据返回给对方,内容为:%s'%(num,recvData[0]))
num+=1 #6. 关闭套接字
udpSocket.close()

8、udp应用: 聊天室

from socket import *
from time import ctime
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 绑定本地的相关信息
bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udpSocket.bind(bindAddr)
while True:
#3. 等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
#4. 打印信息
print('【 %s】 %s:%s'%(ctime(),recvData[1],recvData[0])) #5. 关闭套接字
udpSocket.close()

强势插入——基于udp协议多线程接收数据并回复数据

from socket import socket,AF_INET,SOCK_STREAM,SOCK_DGRAM
from threading import Thread
from time import sleep class MyThread(Thread):
def __init__(self,udpSocket,recvData,recvAddress):
self.recvData = recvData
self.recvAddress = recvAddress
self.udpSocket = udpSocket
Thread.__init__(self) def run(self):
sendData = self.recvData.decode('gbk') + '--收到了\n'
self.udpSocket.sendto(sendData.encode('gbk'),self.recvAddress) #1. 创建基于UDP协议的socket对象
myUDP = socket(AF_INET,SOCK_DGRAM)
#2. 监听指定的端口号
myUDP.bind(('',8888))
while True:
#3. 接收数据,地址
print('等待接收中......')
#myUDP.recvfrom(1024)得到的是一个(数据,(ip,port))
recvData,recvAddress = myUDP.recvfrom(1024)
#4. 回复
MyThread(myUDP,recvData,recvAddress).start() #5. 关闭sockcet
myUDP.close()

9、udp总结

  1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
  2. udp服务器、 客户端

    udp的服务器和客户端的区分: 往往是通过请求服务 和 提供服务来进行区分

    请求服务的一方称为: 客户端

    提供服务的一方称为: 服务器
  3. udp绑定问题

    一般情况下, 服务器端, 需要绑定端口, 目的是为了让其他的客户端能够正确发送到此进程

    客户端, 一般不需要绑定, 而是让操作系统随机分配, 这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

10、给飞秋发信息

应用程序可以在通用的tcp/ip协议基础上,加上自己的判断,组成新的应用层协议。

比如飞秋,使用的是udp协议,在此基础上包装成了IPMSG协议。

格式:

  • 版本号:包编号:发送者姓名:发送者机器名:命令字:消息
  • 1:12323434:帅哥一枚:奇酷的电脑:32:大叫好,我是一个名大帅哥
  • 注:现行的IPMSG协议的版本是1
import socket

#创建socket对象
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#目的地
destAdress = ('192.168.11.74',2425)
#消息内容
sendMsg = input('>>')
#编码
sendMsg = sendMsg.encode('gbk')
#发送
udpSocket.sendto(sendMsg,destAdress) #关闭socket对象
udpSocket.close()
print('over......')

12、udp给飞秋广播发消息(群发)

from socket import *

#创建socket对象
myUDP = socket(AF_INET,SOCK_DGRAM)
#设置可以向广播地址发消息
myUDP.setsockopt(SOL_SOCKET,SO_BROADCAST,1)
#目的地
destAdress = ('<broadcast>',2425)
#消息内容
sendMsg = input('>>')
#编码
sendMsg = sendMsg.encode('gbk')
#发送
myUDP.sendto(sendMsg,destAdress) #关闭socket对象
myUDP.close()
print('over......')

13、模拟QQ

from threading import Thread
from socket import * # 1. 收数据,然后打印
def recvData():
while True:
recvInfo = udpSocket.recvfrom(1024)
print(">>%s:%s" % (str(recvInfo[1]), recvInfo[0])) # 2. 检测键盘,发数据
def sendData():
while True:
sendInfo = input("<<")
udpSocket.sendto(sendInfo.encode("gb2312"), (destIp, destPort)) udpSocket = None
destIp = ""
destPort = 0 def main():
global udpSocket
global destIp
global destPort destIp = input("对方的ip:")
destPort = int(input("对方的port:")) udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.bind(("", 4567)) tr = Thread(target=recvData)
ts = Thread(target=sendData) tr.start()
ts.start() # tr.join()
# ts.join() if __name__ == "__main__":
main()

07.网络编程-2.UDP的更多相关文章

  1. 网络编程 单纯UDP通信

    网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...

  2. java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)

    java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...

  3. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  4. 网络编程(UDP协议-聊天程序)

    网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...

  5. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  6. Linux网络编程:UDP Socket编程范例

    TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...

  7. Java入门网络编程-使用UDP通信

    程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...

  8. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  9. 网络编程基础+UDP的实现

    网络地址分类(32位网络地址) A类地址:第一个字节为网络地址,其他3个字节主机地址,第一字节的最高位固定为0 从1.0.0.1------126.255.255.255 B类地址:第一字节和第二字节 ...

随机推荐

  1. tiny4412移植opencv2.4.7手记

    在买了新的4412板子后.打算趁着刚成功在6410上移植过的经验,速度解决下.不想出现了各种问题.小结下: 1.关于opencv的移植: tiny4412的linux3.5上,须要把opencv的li ...

  2. HDU1010-奇偶剪枝(DFS)

    题目链接:Tempter of the Bone 第一次做剪枝的题目,剪枝,说实话研究的时间不短.好像没什么实质性的进展,遇到题目.绝对有会无从下手的感觉,剪枝越来越神奇了. .. . HDU1010 ...

  3. C# winform 组件---- folderBrowserDialog与openFileDialog(转)

    C# winform 组件---- folderBrowserDialog与openFileDialog 2009-06-27 13:36 2153人阅读 评论(1) 收藏 举报 winformc#b ...

  4. Java 发送短信

    这是一个调用sms接口发短信的程序,支持同时发送的短信量并不是很大,只作为学习使用(当然如果你想内部使用也行) 源码:package com; import org.apache.commons.ht ...

  5. php 提交编辑数据没有变,返回0,判断

    php 提交编辑数据没有变,返回0,判断以TP为例子 $edit = D('Brand')->save($data);if($edit == true){ echo "修改成功&quo ...

  6. 自学Python七 爬虫实战一

    此文承接上文,让我们写一个简简单单的爬虫,循序而渐进不是吗?此次进行的练习是爬取前5页什么值得买网站中的白菜价包邮信息.包括名称,价格,推荐人,时间. 我们所需要做的工作:1.确定URL并获得页面代码 ...

  7. 5.13Junit单元测试-反射-注解

    一.Junit单元测试 * 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值 2.白盒测试:需要些代码的.关注程序具体的执行流程 Junit使用:白盒测试 步骤: 1.定义 ...

  8. Laravel5.1学习笔记3 HTTP中间件

    HTTP 中间件 简介 建立中间件 注册中间件 可终止中间件 简介 HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证 ...

  9. python--1、入门

    python的创始人为吉多·范罗苏姆(Guido van Rossum). python在2017年统计的所有语言排名中处于第四名,稳步上升状态. python应用领域: WEB开发(Django框架 ...

  10. MTK刷机工具Flash_Tool部分4032错误解决办法

    MTK刷机工具Flash_Tool部分4032错误解决办法 先说明一点,这个办法不是万能的,我测试解决了以下两种情况下的4032: 1.本来正常的开发板,因为一次刷机失败后就一直变4032了 2.新开 ...