先展示代码:
from socket import *
udp_socket = socket(AF_INET, SOCK_DGRAM)
dest_addr = ('127.0.0.1', 9988)
data = input("输入发送的内容:")
udp_socket.sendto(data.encode('gbk'), dest_addr)
recv = udp_socket.recvfrom(1024)
print("收到的数据为:", recv[0].decode('gbk'))
print("发送方地址:{}:{}".format(recv[1][0], recv[1][1]))
udp_socket.close()
描述:
第一行from socket import *
作用是导入socket模块,socket模块是底层网络模块,这个模块提供了访问 BSD 套接字 的接口。
详细可查询官网Socket描述
第二行udp_socket = socket(AF_INET, SOCK_DGRAM)
创建一个UDP套接字,Python官网对于套接字的描述:套接字 。
简单来讲,我们会用这个套接字对数据进行接收和发送。
第三行dest_addr = ('127.0.0.1', 9988)
创建一个元组,用来表示目的地址的IP和端口号,第一个元素是IP,类型为字符串,第二个元素是端口号,类型为整型。
第四行data = input("输入发送的内容:")
用来输入用户需要发送的内容
第五行udp_socket.sendto(data.encode('gbk'), dest_addr)
套接字使用sendto函数将数据通过127.0.0.1的9988端口发送过去,sendto的第一个参数为字符串,用来发送需要传输的数据,通过encode(‘gbk’)转为GBK编码;第二个参数是一个元组,存放IP和端口号
第六行recv = udp_socket.recvfrom(1024)
用来接收对方输入给我们的内容,1024表示单词最大发送数据为1024字节
对于七、八行,如果替换为print(recv),我们可以看到这样的结果:
由图可知,返回的结果是一个二维元组,所以 recv[0] 表示对方传给我们的数据(接收到的数据),recv[1][0] 表示接收到的IP地址,recv[1][1] 表示接收到的端口号
最后一行udp_socket.close()
用来释放socket
若要固定自己发送的端口号,可加上下述代码
locad_addr = ('', 9000)
udp_socket.bind(locad_addr)
软件网络调试助手(NetAssist)下载: 链接
"""
udp 聊天器
"""
from socket import *
def send_msg(udp_socket):
dest_ip = input("请输入目标IP:")
dest_port = int(input("请输入端口号:"))
data = input("请输入要发送的内容:")
udp_socket.sendto(data.encode('GBK'),(dest_ip,dest_port))
def recv_msg(udp_socket):
recv_data = udp_socket.recvfrom(1024)
print("收到内容:", recv_data[0].decode('GBK'))
print("发送地址:{}:{}".format(recv_data[1][0], recv_data[1][1]))
def main():
udp_socket = socket(AF_INET, SOCK_DGRAM)
local_addr = ('', 7890)
udp_socket.bind(local_addr)
while True:
print("*" * 30)
print("1.发送信息")
print("2.接收信息")
print("*" * 30)
num = input("请输入选项(回车结束):")
if not num:
print("Bye")
break
elif num == "1":
send_msg(udp_socket)
elif num == "2":
recv_msg(udp_socket)
else:
print("无效输入!")
continue
if __name__ == '__main__':
main()



