项目场景:
项目相关背景简述:
将信息通过UDP在两个电脑间进行交互,传输数据类型为Str
在探索代码功能时,首先实现了单个电脑间的UDP通信;然后通过查阅实现了两台电脑的通信,下面将分两种情况进行说明。
问题描述:
在没有接触电脑信息通信之前,我一直觉得从端口读取数据是一件很麻烦的事情,但是当自己真正去做的时候,发现要实现简单的功能并没有那么复杂。 简单描述一下:(1)一台电脑的信息交互
一台电脑使用Python Socket UDP进行信息交互需要知道三个量:分别为地址IP,端口Port,交互信息msg。它们的作用很明显,就举一个生活中常见的例子,我们收某宝、某东快递,需要写一个收货地址,这就是我们的IP,但是只写一个地址,我们是不能准确收到快递的,在大学校园,我们很多人共用一个地址,因此还需要分配一个自提柜号用于投放和取快递,这就是端口的作用,用来信息的发送和收取。
(2)两台电脑之间的信息交互
两台电脑之间的信息交互,就好像你买了东西,且要换货。那么完这两件事情不仅需要你的收货地址,和自提柜端口,还需要商家提供的退货地址和自提柜端口,而货物则是我们需要互相传输的信息。
代码解释:
一、单个电脑之间的信息交互
import socket
import time
'''
在任何类型的通信开始之前,网络应用程序都必须创建套接字,socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
send_msg_port 是用于信息发送的套接字
receive_msg_port 是用于信息接收的套接字
'''
send_msg_port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
receive_msg_port = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
'''
信息接收套接字需要绑定一个接收IP('127.0.0.1')和端口(9000)
地址IP填写:如果是本机地址(不联网可用),填写''或者'127.0.0.1'
端口Port一般选取8000以后的端口,下面代码绑定了端口9000,用于数据的收取。
'''
receive_msg_port.bind(('127.0.0.1', 21000))
send_msg = 'Hello World!'
while True:
# 设置非阻塞发送信息模式
send_msg_port.setblocking(False)
send_msg_port.sendto(order_data.encode('utf-8'), ('127.0.0.1', 21000))
# 地址还可以为''
send_msg_port.sendto(order_data.encode('utf-8'), ('', 21000))
print("------>>>>发送信息成功")
# 在本机端口接收信息,接受到两个值,一个为信息,一个为地址
receive_msg, receive_address = receive_msg_port.recvfrom(1024)
# 还需要在这里将信息格式进行转化
receive_msg = receive_msg.decode('utf-8')
print("信息接收地址/端口:", receive_address,'接收信息:', receive_msg )
time.sleep(0.05)
看到这里,可以通过上面的代码完成一个简单的信息交互,可能对于地址和端口有疑问,下面将讲解我对于端口和地址的几个测试
补充地址的获取
(1) 本机地址:‘127.0.0.1’,’'
(2) 通过win+R,打开cmd,输入ipconfig,即可获取ip地址(一般选取IPv4)
(3) 通过win+R,打开cmd,输入**netstat -ano **,可以查看本机开放的全部端口。通过活动连接协议可看到是UDP还是TCP连接模式,从地址一栏可以看较常使用的地址。
(4) 举例说明
a. 通过 win+R打开cmd,输入ipconfig,获取无线局域网适配器 WLAN
IPv4 地址… … …192.168.1.12(此地址可用于同一个无线网下不同电脑间的信息交互)
b. 通过 win+R打开cmd,输入netstat -ano,查找协议为UDP的行,找到地址**‘127.0.0.1’,‘192.168.123.16’**,第一个可以作为本机地址交互,第二个可以作为局域网信息交互的地址。
二、局域网下多个电脑之间的交互
说明: 在局域网下进行信息交互,首先要确认每台电脑的地址,其次还需要验证是否可以通过地址与其连接,流程如下。
a. 通过输入ipconfig或者netstat -ano获取在无线网的地址;
b. 每台电脑通过打开cmd,输入ping ##(##为其他电脑的地址),验证是否能够通过无线网连接到地址。
输入ping (地址), 然后回车键。如果输出信息丢失率为0%,则证明连接成功!
如果失败,则查阅是否地址输错,或者地址找错(127.0.0.1是本机地址,和别的电脑连接时不用填。)
(1)代码举例
'''
发送信息,需要收信息电脑地址和接收信息的ip
我通过ipconfig、netstat -ano查阅地址为192.168.123.16(每个电脑都不同),自己定义一个端口为21800.
'''
import socket
send_info_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
send_info = 'Hello, other computers!'
while True:
send_info_socket .setblocking(False)
send_info_socket .sendto(send_info .encode('utf-8'), ('192.168.123.16', 21800))
print("发送成功!")
'''
接收信息,需要信息电脑地址和接收信息的ip
我通过ipconfig、netstat -ano查阅地址为192.168.123.16(每个电脑都不同),自己定义一个端口为21800.
'''
import socket
receive_info_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)v
receive_info_socket .bind(('192.168.123.16', 21800))
whilr True:
receive_info = receive_info_socket .recvfrom(1024)
receive_info_data = receive_info [0].decode('utf-8')
print("接收到来自", receive_info [1], "的信息为:", receive_info_data)
总结:一般来说,地址获取很重要,学会从不同电脑上获取地址是开启不同设备之间信息交互的第一步。学会使用ping加地址验证是否地址连接成功。如果不成功,有很多关于如何打开防火墙,开启网络共享的方式,可以查阅相关问题的解决方法,这里就不多说了。还有需要注意的是端口的选择需要选择未被占用的端口,因为socket很容易出现端口占用的情况导致程序报错,按照文章走一遍你应该可以掌握基本的UDP信息交互方法。
本文总结了利用Python Socket 通过UDP通信协议实现单地址和多地址的信息实时交互方法,有关地址获取和确认方法进行了总结,欢迎批评交流!