Python 网络编程2:UDP-发送、接收数据

简介: Python 网络编程2:UDP-发送、接收数据

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。

根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。


一、UDP 网络程序 - 发送数据



  • 1.1、发送数据的流程
  • 创建套接字
  • 发送数据
  • 关闭套接字
  • 1.2、创建udp的套接字


udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  • 1.3、输入套接字发送的内容


send_data = input("请输入发送的内容:")
  • 1.4、发送套接字内容
  • 第一个参数是:发送的内容;   内容要是byte类型,用utf-8转一下
  • 第二个参数是元组类型,元组内两个参数,第一个是:对方的ip地址,第二个是对方的port(端口)


udp_socket.sendto(send_data.encode('utf-8'),("192.168.3.6",8080))
  • 1.5、发送完内容关闭套接字


udp_socket.close()
  • 1.6、完整的udp套接字发送代码(可以把 2 的内容放到while True:循环里面,一直发送数据)


import socket
def main():
      # 1、创建一个udp的套接字
      udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
      # 2、使用udp的socket发送数据
      # 2.1、用键盘输入发送的内容
      send_data = input("请输入发送的内容:")
      # 2.2、使用套接字发送内容
      # 第一个参数是:发送的内容;
      # 第二个参数是元组类型,元组内两个参数,第一个是:对方的ip地址,第二个是对方的port(端口)
      udp_socket.sendto(send_data.encode('utf-8'),("192.168.3.6",8080))
      # 3、关闭套接字
      udp_socket.close()
if __name__ == "__main__":
        main()

提示:同一台电脑不允许有两个相同的端口,发送端如果不设置端口,电脑就会随机分配端口


二、UDP 网络程序 - 接收数据



  • 2.1、接收数据的流程
  • 创建套接字
  • 绑定本地自己的信息(ip和自己设置的port)
  • 接收数据
  • 关闭套接字
  • 2.2、创建套接字


udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  • 2.3、绑定本地自己的信息(ip和自己设置的port)


localaddr = ("",6688) # ip一般不用写,表示本机的任何一个ip,"192.168.3.6"
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip和port,其他的电脑不行
  • 2.4、接收数据(Windows解码是用 dbk,想要一直接收数据,可以把内容放到while True:循环里面,一直接收数据)


# 3.1、接收内容(参数是允许接收的最大内容)
receive_data = udp_socket.recvfrom(1024)
# 3.2、接收的内容分为两部分:一部分是 存储的时候接收的数据,另一部分是发送方的ip和port
receive_message = receive_data[0] # 存储接收的数据
receive_addr = receive_data[1] # 存储发送方的地址信息
print("内容=%s : 对方的信息=%s"%(str(receive_addr),receive_message.decode("utf-8")))
  • 2.5、关闭套接字
udp_socket.close()

提示:同一台电脑不允许有两个相同的端口,接收方必须设置端口,

  • 网络通信过程中,之所需要ip、port等,就是为了能够将一个复杂的通信过程进行任务划分,从而保证数据准确无误的传递


三、一个简单的UDP聊天器



  • 3.1、需求:在一个电脑中编写1个程序,有2个功能
  • 1、获取键盘数据,并将其发送给对方
  • 2、接收数据并显示,并且功能数据进行选择以上的2个功能调用
  • 3.2、代码实现


import socket
def sent_message(udp_socket):
      """发送消息"""
      # 2、让用户输入对方的IP和端口号
      dest_ip = input("请输入对方的ip:")
      try:
         dest_port = input("请输入对方的port:")
      except:
         print("请输入正确的端口号")
      # 3、从键盘获取要发送的数据
      send_data = input("请输入要发送的内容:")
     # 4、用套接字发送内容
     udp_socket.sendto(send_data.encode('utf-8'),(dest_ip,dest_port))
def receive_message(udp_socket):
         """接收消息"""
         # 2、使用 udp_socket 套接字就接收数据,接收内容(参数是允许接收的最大内容)
         receive_data = udp_socket.recvfrom(1024)
         # 3、接收的内容分为两个部分:
         # 一部分是:对方发送的内容
         # 另一部分是:对方的本地信息
         receive_content = receive_data[0].decode('utf-8') # 存储接收的数据
         receive_localAddr = receive_data[1] # 对方的本地信息
         print("%s:%s"%(receive_content,receive_localAddr))
def main():
       """主函数:聊天神器"""
       # 1、创建udp套接字
       udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
       # 2、绑定一个本地的信息
       local_addr = ("",7777)
       udp_socket.bind(local_addr) # 必须绑定自己电脑的ip和port,其他的电脑不行
       # 3、功能选择
       print("欢迎使用UDP聊天神器")
       # 用循环来处理事情
       while True:
           print("1:发送消息\n2:接收消息")
           input_str = input("请输入选择的功能:")
           if input_str == "1":
                 # 发送数据
                 sent_message(udp_socket)
           elif input_str == "2":
                 # 接收数据
                 receive_message(udp_socket)
           elif input_str == "0":
                 # 退出程序
                 break
           else:
               print("请输入正确的功能")
       # 4、关闭套接字
       udp_socket.close()
if __name__ == "__main__":
        main()

提示:以上的程序如果选择了接收数据功能,并且此时没有数据,程序会堵塞在这,那么怎样才能让这个程序收发数据一起进行呢?后面多任务知识之后就解决


四、拓展:通信中的:单工、半工、全双工



单工:表面意思就是单项的操作,其实就是通信的单项传输,如收音机,你只能接收数据

半双工:是既可以发送数据,也可以接收数据,但是二者不能同时进行,如:对讲机,对方说完话,你才可以听到,他说的内容

全双工:发送内容与接收内容是可以同步进行的,如:电话,我们可以听着别人的话,也可以说出话,同时进行。

目录
打赏
0
0
0
0
18
分享
相关文章
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
114 82
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
30 12
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
87 17
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
64 10
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
73 10
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等