Python 基础 之 网络 socket 使用 udp (SOCK_DGRAM)实现简单的消息发送和接收
目录
Python 基础 之 网络 socket 使用 udp (SOCK_DGRAM)实现简单的消息发送和接收
附录:NetAssist (网络调试助手)可以百度搜索下载即可
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
本节简单介绍,使用 python 进行网络通讯的的案例,socket udp 实现消息的发送和接收的简单使用。
二、实现原理
1、socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 创建套接字
2、socket.sendto 和 socket.recvfrom 发送和接收消息
3、借助 NetAssist (网络调试助手)进行功能验证
三、注意事项
1、如果 socket.bind 绑定ip和端口,会自动绑定本地ip和动态端口
2、注意发送带有中文等消息的时候,注意进行encode和decode
3、中文的注意区分 utf-8 还是 gbk (我这里使用的是 Windows 平台的 NetAssist ,使用gbk 编解码 )
4、创建完 socket 最后记得关闭 socket.close
四、效果预览
五、实现步骤
socket udp 消息发送
1、打开 pycharm 新建一个工程,即可新建一个python文件
2、打开 NetAssist (网络调试助手)开启 udp 服务,
3、编写脚本,实现使用 socket 数据报发送消息的功能(发送 ip 和 端口既是开启 udp 服务的 ip 端口)
4、运行脚本,即可向 NetAssist 发送数据
socket udp 接收消息
1、打开 pycharm 新建一个工程,即可新建一个python文件
2、打开 NetAssist (网络调试助手)开启 udp 服务,
3、编写脚本,实现使用 socket 数据报接收消息的功能(绑定一个端口,便于接收 NetAssist 发过来的消息 )
4、运行脚本,即可接收 NetAssist 发过来的消息
六、关键代码
1、UdpBaseUse_Send_01.py
import socket # 引进 socket 包
def udp_use_send(ip, port):
"""
使用 udp 发送数据
:param ip: 目标 ip
:param port:目标 端口
:return:
"""
# 创建一个 udp 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地ip和自定义端口(如果没有这边,程序会自动动态绑定本地ip和动态端口)
udp_socket.bind(("", 7878))
while True:
# 键盘输入数据
msg = input("请输入数据……")
# 发送数据到指定 ip
# udp_socket.sendto(msg.encode('utf8'), (ip, port))
# windows 系统使用 gbk
udp_socket.sendto(msg.encode('gbk'), (ip, port))
# 发送 bye 退出
if msg == "bye":
break
# 关闭套接字
udp_socket.close()
def main():
ip = "192.168.1.102"
port = 8080
udp_use_send(ip, port)
if __name__ == "__main__":
main()
2、UdpBaseUse_Recieve_02.py
import socket
def udp_use_receive():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定一个本地 IP 和 指定端口号
local_address = ("", 5566)
udp_socket.bind(local_address)
# 接收数据
while True:
recv_data = udp_socket.recvfrom(1024)
# recv_data 这个变量中存储的是一个元组(接收到的数据,(发送数据端的ip,port))
recv_msg = recv_data[0] # 消息数据
send_addr = recv_data[1] # 发消息端的 ip + port
# 打印数据
print(recv_data)
# 数据解码
# recv_msg = recv_msg.decode("utf-8")
# windows 端 数据解码 gbk
recv_msg = recv_msg.decode("gbk")
# 重新组合数据打印数据
print("%s:%s" % (str(send_addr), recv_msg))
# 数据是 bye 就退出
if recv_msg == "bye":
break
# 关闭套接字
udp_socket.close()
pass
def main():
udp_use_receive()
if __name__ == "__main__":
main()
附录:NetAssist (网络调试助手)可以百度搜索下载即可