3、网络编程- Udp接收数据

udp接收数据,网络调试助手担任发送方,但发送时需要对方的也就是虚拟机的ip 和端口,ip可以通过config获取,那么如何让一个程序拥有一个固定端口呢?
在这里插入图片描述

创建套接字的时候是没有端口号的,好比买了手机没有手机号,别人是找不到你的,所以要有一个固定的端口号,用udp_socket.bind()绑定一个端口

接下来写程序,终端中:
vim 05 绑定端口用来接收数据.py

写程序的思路: if name==“main”:
main()
然后再def main():
在这个函数里写代码。
用注释来搭建流程
#1、创建套接字
#2、绑定一个本地信息
#3、接收数据
#4、打印接收到的数据
#5、关闭套接字
流程搭建完之后开始写代码,创建套接字的时候,用的是socket.XX,此时需要在代码的最上方导入socekt,用到什么导什么,代码不是从第一行开始写的。
因为当代码比较多的时候,比如200多行,不确定会用到什么,所以用到什么导入什么,用到什么再调什么。

1、udp绑定端口用来接收数据.py

代码具体形式如下:

import socket
def main():
 #1、创建套接字
 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 #2、绑定一个本地信息(udp ctrl n自动补全),必须绑定自己电脑的ip  port其它电脑的不行
 	 绑定的是一个元组,用localaddr变量表示,本地ip,绑定端口,端口号大于1024
 localaddr =("",7788)
 udp_socket.bind(localaddr)
 #3、接收数据(发送数据是套接字.sendto 接收是套接字.recvfrom(1024),
 	1024表示本次接收的最大字节数),并用recv_data变量接收
 recv_data = udp_socket.recvfrom(1024)
 #4、打印接收到的数据
 print(recv_data)
 #5、关闭套接字
udp_socket.close()
if __name__=="__main__":
	main()

代码完成后,终端中python3 05 绑定端口用来接收数据.py 运行程序,此时由网络调试助手发送过来的消息就可以在终端中收到,收到的内容显示情况如下:
在这里插入图片描述

打印出来的数据即变量recv_data,是一个元组,第一个参数是发送的数据,第二个参数是一个小元组,是发送方的ip和端口。

想要在终端中只显示接收到的数据,不显示对方的ip 和端口,操作如下:
cp 05 绑定端口用来接收数据.py 06解析出接收到数据.py

2、解析出接收到数据.py

关于注释:
如果在一行的开头注释,直接用# 后面跟上一个空格 再写注释内容
如果是在代码后面注释 代码后面加两个空格 再用# 跟上一个空格 再写注释内容

打印代码调整时的思路:
print(“s% : s%”,%(send_addr,recv_msg))
但send_addr是一个元组,不能直接这样用,需要用str(send_addr)来转换
recv_msg也不能直接用,因为发送时是用编码编成了bite类型,收到的也是bite类型,如果直接发送过来的是字母,可以收到,但是如果发送过来是汉字,收到的是乱码,此时需要解码,
recv_msg.decode(“utf-8”),但是此时用windows的网络调试助手发送中文过来还是乱码,因为windows不是用utf-8编码的,用的是gbk编码,所以此时解码需要用gbk,即:recv_msg.decode(“gbk”)
如果将网络调试助手放到ubantu中,解码还是要用utf-8来解

import socket
def main():
 #1、创建套接字
 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 #2、绑定一个本地信息
 localaddr =("",7788)
 udp_socket.bind(localaddr)
 #3、接收数据
 recv_data = udp_socket.recvfrom(1024)
 recv_msg = recv_data[0]  # 用来接收发送的内容
 send_addr = recv_data[1]  # 用来接收发送方的ip和port
 #4、打印接收到的数据
 #print(recv_data)  # 此时打印的代码需要注释掉,重新调整
 pint("s%:s%",%(str(send_addr),recv_msg.decode("gbk")))
 #5、关闭套接字
udp_socket.close()
if __name__=="__main__":
	main()

**总结:

  • 发送数据步骤:
    1.创建套接字
    2.发送数据
    3.关闭套接字

  • 接收数据步骤:
    1.创建套接字
    2.绑定本地的ip 端口
    3.接收数据
    4.打印套接字

想要在终端中循环一直接收数据,操作如下:
cp 06解析出接收到数据.py 07循环接收数据.py
vim 07循环接收数据.py

3、循环接收数据.py

想要循环接收,就要用while true ,对接收和打印代码进行while true:
ESC 大V 上下箭头选中,大于号向右缩进

import socket
def main():
 #1、创建套接字
 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
 #2、绑定一个本地信息
 localaddr =("",7788)
 udp_socket.bind(localaddr)
 #3、接收数据
 while True:
	 recv_data = udp_socket.recvfrom(1024)
	 recv_msg = recv_data[0]  # 用来接收发送的内容
	 send_addr = recv_data[1]  # 用来接收发送方的ip和port
	 #4、打印接收到的数据
	 pint("s%:s%",%(str(send_addr),recv_msg.decode("gbk")))
 #5、关闭套接字
udp_socket.close()
if __name__=="__main__":
	main()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值