07.网络编程-2.UDP
1、udp介绍
UDP --- 用户数据报协议, 是一个无连接的简单的面向数据报的传输层协议。 UDP不提供可靠性, 它只是把应用程序传给IP层的数据报发送出去, 但是并不能保证它们能到达目的地。 由于UDP在传输数据报前不用在客户和服务器之间建立一个连接, 且没有超时重发等机制, 故而传输速度很快。
UDP是一种面向无连接的协议, 每个数据报都是一个独立的信息, 包括完整的源地址或目的地址, 它在网络上以任何可能的路径传往目的地, 因此能否到达目的地, 到达目的地的时间以及内容的正确性都是不能被保证的。
【 适用情况】
UDP是面向消息的协议, 通信时不需要建立连接, 数据的传输自然是不可靠的, UDP一般用于多点通信和实时的数据业务, 比如:
- 语音广播
- 视频
- TFTP(简单文件传送)
- SNMP( 简单网络管理协议)
- RIP( 路由信息协议, 如报告股票市场, 航空信息)
- DNS(域名解释)
UDP操作简单, 而且仅需要较少的监护, 因此通常用于局域网高可靠性的分散系统中client/server应用程序。 例如视频会议系统, 并不要求音频视频数据绝对的正确, 只要保证连贯性就可以了, 这种情况下显然使用UDP会更合理一些。
2、udp网络程序-发送数据
创建一个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.关闭套接字
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总结
- udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
- udp服务器、 客户端
udp的服务器和客户端的区分: 往往是通过请求服务 和 提供服务来进行区分
请求服务的一方称为: 客户端
提供服务的一方称为: 服务器 - 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的更多相关文章
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)
java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- 网络编程(UDP协议-聊天程序)
网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
- Linux网络编程:UDP Socket编程范例
TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...
- Java入门网络编程-使用UDP通信
程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- 网络编程基础+UDP的实现
网络地址分类(32位网络地址) A类地址:第一个字节为网络地址,其他3个字节主机地址,第一字节的最高位固定为0 从1.0.0.1------126.255.255.255 B类地址:第一字节和第二字节 ...
随机推荐
- HDU1024_Max Sum Plus Plus【滚动数组】
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 通过指针访问C++对象的私有成员
C++对象的私有成员是禁止类外的访问的.但是我们仍然可以通过指针访问C++对象的私有成员. #include <iostream> using namespace std; class A ...
- 海思3518e mpp2/sample/venc makefile简析
http://blog.csdn.net/u011003120/article/details/51324567
- Linux Framebuffer驱动框架之二软件架构(未完待续)【转】
本文转载自:http://blog.csdn.net/gqb_driver/article/details/12918547 /************************************ ...
- Android4.4 wpa_supplicant深入分析之wpa_supplicant初始化流程续
下面我们将接上一篇文章继续分析main中第二个关键函数wpa_supplicant_add_iface. wpa_supplicant_add_iface用于向wpa_supplicant添加接口设备 ...
- kafka备份机制——zk选举leader,leader在broker里负责备份
Kafka架构 如上图所示,一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU.memory等),若干broker(Kafka支 ...
- 98.Ext.form.Label组件的基本用法
转自:https://www.cnblogs.com/kelly/archive/2009/06/05/1496897.html 本篇介绍Ext.form.Label组件的基本用法: 这里通过上一篇介 ...
- python 函数参数的传递(参数带星号的说明)
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- Python 40 数据库-外键约束 、多对一与多对多的处理
mysql提供了 foreign key,专门用于为表和表之间 建立物理关联 思考 表里存储的是一条条的记录,两个表之间能产生的关系有哪些? 现有 A B两张表 1.多对一 2.一对一 ...
- 命令行启动ubuntu
图形模式下,首先进入终端: 1. 运行 sudo vi/etc/default/grub 2. 找到 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash” 3.改为 GR ...