多语言 网站源码,网络投放广告,中小企业有哪些,展馆在线设计平台一、udp简介udp --- 用户数据报协议#xff0c;是一个无连接的简单的面向数据报的运输层协议。udp不提供可靠性#xff0c;它只是把应用程序传给IP层的数据报发送出去#xff0c;但是并不能保证它们能到达目的地。udp在传输数据报前不用在客户和服务器之间建立一个连接…一、udp简介udp --- 用户数据报协议是一个无连接的简单的面向数据报的运输层协议。udp不提供可靠性它只是把应用程序传给IP层的数据报发送出去但是并不能保证它们能到达目的地。udp在传输数据报前不用在客户和服务器之间建立一个连接且没有超时重发等机制故而传输速度很快。udp是一种面向无连接的协议每个数据报都是一个独立的信息包括完整的源地址或目的地址它在网络上以任何可能的路径传往目的地因此能否到达目的地到达目的地的时间以及内容的正确性都是不能被保证的。二、udp特点udp是面向无连接的通讯协议udp数据包括目的端口号和源端口号信息由于通讯不需要连接所以可以实现广播发送。 udp传输数据时有大小限制每个被传输的数据报必须限定在64KB之内。 udp是一个不可靠的协议发送方所发送的数据报并不一定以相同的次序到达接收方。udp是面向消息的协议通信时不需要建立连接数据的传输自然是不可靠的udp一般用于多点通信和实时的数据业务比如语音广播TFTP(简单文件传送)SNMP(简单网络管理协议)RIP(路由信息协议如报告股票市场航空信息)DNS(域名解释)三、udp网络程序-发送数据创建一个udp客户端程序的流程是简单具体步骤如下创建客户端套接字发送/接收数据关闭套接字代码如下#codingutf-8from socket import *#1、创建socket套接字#socket(参数1参数2)#参数1 AF_INET固定的#参数2 SOCK_DGRAM表示udp上篇文章中说过SOCK_STREM表示tcpudpSocket socket(AF_INET,SOCK_DGRAM)#2、准备接收方的地址sendAddress (192.168.100.101,8080)#3、从键盘输入需要发送的数据sendData input(请输入要发送的数据)#4、发送数据到指定电脑udpSocket.sendto(sendData.encode(),sendAddress)#5、关闭socket套接字udpSocket.close()运行程序这个时候我就向我的另外一台IP地址为192.168.100.101 端口号为8080的程序发送了“我是侯哥”这一条消息。我们借助于网络调试助手软件用于测试网络调试助手各个平台的系统都有大家可以自己下载使用。说明我的代码是在windows电脑上运行的我的网络调试助手是在Mac电脑上运行的如果没有两台电脑的也可以使用虚拟机测试。四、udp网络程序-接收数据#codingutf-8from socket import *#1、创建socket套接字udpSocket socket(AF_INET,SOCK_DGRAM)#2、准备接收方的地址sendAddress (192.168.100.101,8080)#3、从键盘输入需要发送的数据sendData input(请输入要发送的数据)#4、发送数据到指定电脑udpSocket.sendto(sendData.encode(),sendAddress)#5、等待接收对方发送的数据receiveData udpSocket.recvfrom(1024)#6、显示对方发送的数据print(receiveData)#7、关闭socket套接字udpSocket.close()运行程序五、udp网络程序-端口问题会变的端口号重新运行多次脚本然后在“网络调试助手”中看到的现象如下说明每重新运行一次网络程序上图中红圈中的数字不一样的原因在于这个数字标识这个网络程序当重新运行时如果没有确定到底用哪个系统默认会随机分配记住一点这个网络程序在运行的过程中这个就唯一标识这个程序所以如果其他电脑上的网络程序如果想要向此程序发送数据那么就需要向这个数字(即端口)标识的程序发送即可六、udp绑定信息一般情况下在一天电脑上运行的网络程序有很多而各自用的端口号很多情况下不知道为了不与其他的网络程序占用同一个端口号往往在编程中udp的端口号一般不绑定但是如果需要做成一个服务器端的程序的话是需要绑定的。就像报警电话每天都在变想必世界就会乱了所以一般服务性的程序往往需要一个固定的端口号这就是所谓的端口绑定绑定示例#codingutf-8from socket import *#1、创建socket套接字udpSocket socket(AF_INET,SOCK_DGRAM)#2、绑定相关信息如果一个网络程序不绑定则系统会随机分配bindAddress (,7781)#ip地址和端口号ip一般不用写表示本机的任何一个ipudpSocket.bind(bindAddress)#3、等待接收方发送消息receiveData udpSocket.recvfrom(1024)#4、显示对方发送的数据print(receiveData)#5、关闭socket套接字udpSocket.close()windows电脑发送信息mac电脑接收信息如下说明一个udp网络程序可以不绑定此时操作系统会随机进行分配一个端口如果重新运行次程序端口可能会发生变化一个udp网络程序也可以绑定信息(ip地址端口号)如果绑定成功那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的七、udp网络通信过程八、udp应用多线程对话聊天实现#codingutf-8from threading importThreadfrom socket import *#接收数据defreceiveInfo():whileTrue:receiveData udpSocket.recvfrom(1024)print(defsendInfo():whileTrue:sendData input()udpSocket.sendto(sendData.encode(gb2312),(destIp,destPort))udpSocketNonedestIp destPort0defmain():globaludpSocketglobaldestIpglobaldestPortdestIp input(对方的IP:)destPort int(input(对方的Port:))udpSocketsocket(AF_INET,SOCK_DGRAM)udpSocket.bind((,4567))#这里写两个()的原因是将(4567)当做一个整体元组使用tr Thread(target receiveInfo)ts Thread(target sendInfo)tr.start()ts.start()tr.join()ts.join()if __name__ __main__:main()Mac电脑上执行程序如下windows电脑上运行网络调试助手如下从而就是实现了基于socket的udp的聊天功能。九、udp应用多线程聊天室的实现程序基本流程创建接收端socket --- 创建发送到socket --- 启动接收端socket --- 启动发送端socket --- 等待用户输入 --- 接收用户输入并发送到广播 --- 接收信息并显示。#-*- coding:utf-8 -*-from socket import *from time importctime, sleepimportthreadingclassChatRoomPlus:def __init__(self):#全局参数配置self.encoding utf-8 #使用的编码方式self.broadcastPort 7788 #广播端口#创建广播接收器self.recvSocket socket(AF_INET, SOCK_DGRAM)self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR,1)self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST,1)self.recvSocket.bind((, self.broadcastPort))#创建广播发送器self.sendSocket socket(AF_INET, SOCK_DGRAM)self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST,1)#其他self.threads []defsend(self):发送广播print(UDP发送器启动成功...)self.sendSocket.sendto(***加入了聊天室.encode(self.encoding), (255.255.255.255, self.broadcastPort))whileTrue:sendData input(请输入需要发送的消息:)self.sendSocket.sendto(sendData.encode(self.encoding), (255.255.255.255, self.broadcastPort))#print(【%s】%s:%s % (ctime(), 我, sendData))sleep(1)defrecv(self):接收广播print(UDP接收器启动成功...)whileTrue:#接收数据格式(data, (ip, port))recvData self.recvSocket.recvfrom(1024)print(【%s】[%s : %s] : %s % (ctime(), recvData[1][0], recvData[1][1], recvData[0].decode(self.encoding)))sleep(1)defstart(self):启动线程t1 threading.Thread(targetself.recv)t2 threading.Thread(targetself.send)self.threads.append(t1)self.threads.append(t2)for t inself.threads:t.setDaemon(True)t.start()whileTrue:passif __name__ __main__:demoChatRoomPlus()demo.start()运行效果Mac电脑上运行linux电脑上运行程序windows上运行程序