一、udp简介

  • udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。
  • udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
  • udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
  • udp是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

二、udp特点:

udp是面向无连接的通讯协议,udp数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 udp传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 udp是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。udp是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,udp一般用于多点通信和实时的数据业务,比如:

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

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

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

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

代码如下:

  1. #coding=utf-8
  2. from socket import *
  3.  
  4. #1、创建socket套接字
  5. #socket(参数1,参数2)
  6. #参数1 = AF_INET固定的
  7. #参数2 = SOCK_DGRAM表示udp,上篇文章中说过SOCK_STREM表示tcp
  8. udpSocket = socket(AF_INET,SOCK_DGRAM)
  9.  
  10. #2、准备接收方的地址
  11. sendAddress = ("192.168.100.101",8080)
  12.  
  13. #3、从键盘输入需要发送的数据
  14. sendData = input("请输入要发送的数据:")
  15.  
  16. #4、发送数据到指定电脑
  17. udpSocket.sendto(sendData.encode(),sendAddress)
  18.  
  19. #5、关闭socket套接字
  20. udpSocket.close()

运行程序:

这个时候我就向我的另外一台IP地址为:192.168.100.101 端口号为8080的程序发送了“我是侯哥”这一条消息。我们借助于网络调试助手软件用于测试,网络调试助手各个平台的系统都有,大家可以自己下载使用。

说明:我的代码是在windows电脑上运行的,我的网络调试助手是在Mac电脑上运行的,如果没有两台电脑的,也可以使用虚拟机测试。

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

  1. #coding=utf-8
  2. from socket import *
  3.  
  4. #1、创建socket套接字
  5. udpSocket = socket(AF_INET,SOCK_DGRAM)
  6.  
  7. #2、准备接收方的地址
  8. sendAddress = ("192.168.100.101",8080)
  9.  
  10. #3、从键盘输入需要发送的数据
  11. sendData = input("请输入要发送的数据:")
  12.  
  13. #4、发送数据到指定电脑
  14. udpSocket.sendto(sendData.encode(),sendAddress)
  15.  
  16. #5、等待接收对方发送的数据
  17. receiveData = udpSocket.recvfrom(1024)
  18.  
  19. #6、显示对方发送的数据
  20. print(receiveData)
  21.  
  22. #7、关闭socket套接字
  23. udpSocket.close()

运行程序:

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

会变的端口号:重新运行多次脚本,然后在“网络调试助手”中,看到的现象如下:

说明:

  • 每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
  • 记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可

六、udp绑定信息

一般情况下,在一天电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定,但是如果需要做成一个服务器端的程序的话,是需要绑定的。就像报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定

绑定示例

  1. #coding=utf-8
  2. from socket import *
  3.  
  4. #1、创建socket套接字
  5. udpSocket = socket(AF_INET,SOCK_DGRAM)
  6.  
  7. #2、绑定相关信息,如果一个网络程序不绑定,则系统会随机分配
  8. bindAddress = ("",7781)#ip地址和端口号,ip一般不用写,表示本机的任何一个ip
  9. udpSocket.bind(bindAddress)
  10.  
  11. #3、等待接收方发送消息
  12. receiveData = udpSocket.recvfrom(1024)
  13.  
  14. #4、显示对方发送的数据
  15. print(receiveData)
  16.  
  17. #5、关闭socket套接字
  18. udpSocket.close()

windows电脑发送信息

mac电脑接收信息如下:

说明:

  • 一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行次程序端口可能会发生变化
  • 一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的

七、udp网络通信过程

八、udp应用:多线程对话聊天实现

  1. #coding=utf-8
  2. from threading import Thread
  3. from socket import *
  4.  
  5. #接收数据
  6. def receiveInfo():
  7. while True:
  8. receiveData = udpSocket.recvfrom(1024)
  9. print("<<%s:%s"%(str(receiveData[1]),str(receiveData[0])))
  10.  
  11. #发送数据
  12. def sendInfo():
  13. while True:
  14. sendData = input("")
  15. udpSocket.sendto(sendData.encode("gb2312"),(destIp,destPort))
  16.  
  17. udpSocket = None
  18. destIp = ""
  19. destPort = 0
  20.  
  21. def main():
  22. global udpSocket
  23. global destIp
  24. global destPort
  25.  
  26. destIp = input("对方的IP:")
  27. destPort = int(input("对方的Port:"))
  28.  
  29. udpSocket = socket(AF_INET,SOCK_DGRAM)
  30. udpSocket.bind(("",4567))#这里写两个()的原因是将(""4567)当做一个整体元组使用
  31.  
  32. tr = Thread(target = receiveInfo)
  33. ts = Thread(target = sendInfo)
  34.  
  35. tr.start()
  36. ts.start()
  37.  
  38. tr.join()
  39. ts.join()
  40.  
  41. if __name__ == '__main__':
  42. main()

Mac电脑上执行程序如下:

windows电脑上运行网络调试助手如下:

从而就是实现了基于socket的udp的聊天功能。

九、udp应用:多线程聊天室的实现

程序基本流程:创建接收端socket ---> 创建发送到socket ---> 启动接收端socket ---> 启动发送端socket ---> 等待用户输入 ---> 接收用户输入并发送到广播 ---> 接收信息并显示。

  1. # -*- coding:utf-8 -*-
  2. from socket import *
  3. from time import ctime, sleep
  4. import threading
  5.  
  6. class ChatRoomPlus:
  7. def __init__(self):
  8. # 全局参数配置
  9. self.encoding = "utf-8" # 使用的编码方式
  10. self.broadcastPort = 7788 # 广播端口
  11.  
  12. # 创建广播接收器
  13. self.recvSocket = socket(AF_INET, SOCK_DGRAM)
  14. self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  15. self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  16. self.recvSocket.bind(('', self.broadcastPort))
  17.  
  18. # 创建广播发送器
  19. self.sendSocket = socket(AF_INET, SOCK_DGRAM)
  20. self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
  21.  
  22. # 其他
  23. self.threads = []
  24.  
  25. def send(self):
  26. """发送广播"""
  27.  
  28. print("UDP发送器启动成功...")
  29. self.sendSocket.sendto("***加入了聊天室".encode(self.encoding), ('255.255.255.255', self.broadcastPort))
  30. while True:
  31. sendData = input("请输入需要发送的消息:")
  32.  
  33. self.sendSocket.sendto(sendData.encode(self.encoding), ('255.255.255.255', self.broadcastPort))
  34. # print("【%s】%s:%s" % (ctime(), "我", sendData))
  35.  
  36. sleep(1)
  37.  
  38. def recv(self):
  39. """接收广播"""
  40.  
  41. print("UDP接收器启动成功...")
  42. while True:
  43. # 接收数据格式:(data, (ip, port))
  44. recvData = self.recvSocket.recvfrom(1024)
  45.  
  46. print("【%s】[%s : %s] : %s" % (ctime(), recvData[1][0], recvData[1][1], recvData[0].decode(self.encoding)))
  47.  
  48. sleep(1)
  49.  
  50. def start(self):
  51. """启动线程"""
  52.  
  53. t1 = threading.Thread(target=self.recv)
  54. t2 = threading.Thread(target=self.send)
  55. self.threads.append(t1)
  56. self.threads.append(t2)
  57.  
  58. for t in self.threads:
  59. t.setDaemon(True)
  60. t.start()
  61.  
  62. while True:
  63. pass
  64.  
  65. if __name__ == "__main__":
  66. demo = ChatRoomPlus()
  67. demo.start()

运行效果:

Mac电脑上运行

linux电脑上运行程序

windows上运行程序

python网络-Socket之udp编程(24)的更多相关文章

  1. python网络-Socket之TCP编程(26)

    一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...

  2. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  3. 【Socket编程】通过Socket实现UDP编程

    通过Socket实现UDP编程 UDP通信: 1.UDP协议(用户数据报协议)是无连接.不可靠.无序的. 2.UDP协议以数据报作为数据传输的载体. 3.使用UDP进行数据传输时,首先需要将要传输的数 ...

  4. Python网络socket学习

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  5. 【LINUX/UNIX网络编程】之使用SOCKET进行UDP编程

    先看任务需求: 实验二 UDP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本UDP通讯,实现服务器与客户端的文件传送 [实验学时] 4学时 [实验内容] ...

  6. python网络socket编程

    一.服务端 #!/usr/bin/python # -*- coding: UTF-8 -*- import socket import sys from thread import * HOST = ...

  7. python 网络 socket

    ---恢复内容开始--- 1.socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏 ...

  8. 十、Socket之UDP编程

    UDP基础知识 UDP(User Datagram Protocol,用户数据报协议)是一个简单的.面向数据报的无连接协议,提供了快速但不一定可靠的传输服务. UDP与TCP相比主要有以下区别. 1. ...

  9. Python 网络通信协议 tcp udp区别

    网络通信的整个流程 在这一节就给大家讲解,有些同学对网络是既熟悉又陌生,熟悉是因为我们都知道,我们安装一个路由器,拉一个网线,或者用无限路由器,连上网线或者连上wifi就能够上网购物.看片片.吃鸡了, ...

随机推荐

  1. 简单测试Elasticsearch 7.0

    发现不同的地方 1.创建index  (注意:7.0版本之前mappings中需要增加_doc,7.0版之后已去掉) PUT http://10.10.x.x:9200/test 2.Elastics ...

  2. 【转载】OpenSSL 提取 pfx 数字证书公钥与私钥

    转自https://www.cnblogs.com/Irving/p/9551110.html OpenSSL 提取 pfx 数字证书公钥与私钥   由于之前生产环境已经使用了 Identityser ...

  3. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  4. 3DMath

    线与面相交的计算 https://zh.wikipedia.org/wiki/%E7%BA%BF%E9%9D%A2%E4%BA%A4%E7%82%B9 什么是参数方程? 参数是参变数的简称.它是研究运 ...

  5. win10自带的防火墙Windows Defender

    Windows Defender防火墙(别名:windows守卫者)是微软公司自主研发的一款基于windows自身保护的一款系统. Windows Defender可以对系统进行实时监控,对于Wind ...

  6. springboot项目打包

    使用IDEA或Eclipse的插件创建springboot项目的时候可以选择打包方式,一般情况下都是选择的jar包. 当想将原来的jar包格式的项目打成war包在本地tomcat下运行时可以通过以下几 ...

  7. Docker安装及基本操作

    系统环境 CentOS Linux release 7.5.1804 (Core) 安装依赖包 更新系统软件 yum update 安装docker yum install docker 启动dock ...

  8. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  9. 20175324王陈峤宇 《Java程序设计》第六周学习总结

    教材学习内容总结 第七章 一.内部类与外部类的关系 1.内部类可以使用外嵌类的成员变量和方法.2.类体中不可以声明类变量和类方法,外部类可以用内部类声明对象.3.内部类仅供外嵌类使用.4.类声明可以使 ...

  10. Java使用BufferedImage修改图片内容

    1.修改图片的架包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io& ...