Python Socket UDP实时信息通信 单个电脑通信 + 多个电脑通信

项目场景:

项目相关背景简述:
将信息通过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通信协议实现单地址和多地址的信息实时交互方法,有关地址获取和确认方法进行了总结,欢迎批评交流!

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python Socket UDP通信是一种基于UDP协议的网络通信方式,它可以实现点对点的数据传输,具有高效、快速、简单等优点。在Python中,我们可以使用socket模块来实现UDP通信,通过创建socket对象、绑定IP地址和端口号、发送和接收数据等操作,实现网络通信。同时,Python Socket UDP通信也可以应用于各种场景,如网络游戏、实时通信、数据采集等。 ### 回答2: Python socket库是Python标准库的一部分,用于实现网络通信。其使用非常简单,主要是调用socket模块下的一些方法即可完成常见网络通信任务。在Python中,UDP通信是基于socket进行实现的。 UDP是一种无连接协议,通信双方之间没有建立可靠的连接。虽然UDP不如TCP那样可靠,但是它的实时性好,适合于需要实时传输数据的场景。UDP通信方式是通过数据报进行传输,每个数据报最大长度为65,535个字节。 在Python中,通过socket模块创建UDP套接字(socket),然后通过该套接字实现UDP通信。创建UDP套接字的方法为: ``` import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 其中,`AF_INET`代表IPv4协议,`SOCK_DGRAM`代表使用UDP数据报协议。 接下来,就可以使用该套接字实现UDP通信了。 在进行UDP通信时,需要注意以下几点: 1. 给套接字绑定IP地址和端口号 在Python中,使用`bind()`方法将IP地址和端口号绑定到套接字上,以便可以接收来自这个地址和端口的消息。例如: ``` server_socket.bind(('127.0.0.1', 9999)) ``` 其中,`127.0.0.1`表示本机IP地址,`9999`表示端口号。 2. 发送数据报 通过套接字的`sendto()`方法向指定的IP地址和端口号发送数据报。例如: ``` server_socket.sendto('hello, world!', ('127.0.0.1', 8888)) ``` 其中,`'hello, world!'`表示需要发送的数据,`('127.0.0.1', 8888)`表示目标IP地址和端口号。 3. 接收数据报 通过套接字的`recvfrom()`方法接收来自指定IP地址和端口号的数据报。例如: ``` data, addr = server_socket.recvfrom(1024) ``` 其中,`1024`表示接收数据的缓冲区大小。 4. 关闭套接字 在UDP通信完成后,需要使用`close()`方法关闭套接字。例如: ``` server_socket.close() ``` 以上就是Python socket库进行UDP通信的基本步骤。值得注意的是,在实际的网络通信中可能会遇到各种异常情况,例如网络故障、套接字参数错误等,需要合理的使用异常处理机制,以保证程序的正确性和稳定性。 ### 回答3: Python Socket UDP通信是指使用socket库中的UDP协议进行数据传输的一种通信方式。UDP(User Datagram Protocol,用户数据报协议)是在IP协议的基础上实现的一种无连接的传输层协议。UDP协议提供了无状态的、不可靠的数据传输服务,可以快速传输数据包,但是不能提供可靠的数据传输服务,因此在网络上的应用较少,通常用于需要快速传输而不需要可靠性保证的应用场景。 Python中可以通过使用socket库中的socket类来进行UDP通信。在使用socket进行UDP通信时,需要指定socket的类型为SOCK_DGRAM(表示UDP协议),同时需要指定目标地址和端口号。发送数据时,使用sendto()方法将数据打包发送到指定的目标地址和端口号。接收数据时,使用recvfrom()方法接收数据,并返回发送方的地址和端口号。 下面是一个简单的Python Socket UDP通信的示例代码: ```python import socket # 创建UDP socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 目标地址和端口号 target_addr = ('127.0.0.1', 8888) # 发送数据 data = 'Hello, UDP!' udp_socket.sendto(data.encode(), target_addr) # 接收数据 recv_data, addr = udp_socket.recvfrom(1024) print('Received from {}: {}'.format(addr, recv_data.decode())) # 关闭socket udp_socket.close() ``` 在这个示例代码中,首先创建了一个UDP socket,指定了目标地址和端口号为127.0.0.1和8888。然后使用sendto()方法将字符串“Hello, UDP!”发送到目标地址和端口号。接着使用recvfrom()方法接收数据,返回发送方的地址和端口号,将接收到的数据打印出来。最后关闭socket。 需要注意的是,在UDP通信中,由于UDP协议的不可靠性,发送方无法确定数据是否被接收方接收到。如果需要可靠的数据传输服务,应该使用TCP协议进行通信

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值