博客
关于我
基于UDP协议套接字通信的实现
阅读量:291 次
发布时间:2019-03-01

本文共 3358 字,大约阅读时间需要 11 分钟。

基于UDP协议套接字通信的实现

一、UDP实现单用户通信

1. 服务端实现

服务端通过UDP协议接收并处理客户端发送的数据报。注意:UDP是无连接的,服务端和客户端的启动顺序不影响通信。服务端通过bind指定IP地址和端口,接收数据时使用recvfrom获取客户端信息,并通过sendto发送响应数据。

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8123))while True: data_bytes, client_addr = server.recvfrom(1024) server.sendto(data_bytes.upper(), client_addr) print('数据接收并发送成功')server.close()

2. 客户端实现

客户端通过UDP协议向服务端发送数据报。客户端发送数据时使用sendto指定目标IP地址和端口,接收数据时使用recvfrom获取服务端信息。

import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)ip_port = ('127.0.0.1', 8123)while True: msg = input("请输入要发送的消息:").strip() client.sendto(msg.encode("utf-8"), ip_port) data_bytes, server_addr = client.recvfrom(1024) print("收到的数据:", data_bytes.decode("utf-8")) print("发送地址:", server_addr)client.close()

二、UDP协议的无粘包特性

1. 服务端实现

使用UDP协议的服务端可以直接接收和发送完整的数据报,不需要额外处理粘包层。服务端通过recvfrom获取客户端发送的数据以及对应的IP地址和端口。

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8084))while True: data, client_addr = server.recvfrom(1024) print("收到的数据:", data) print("客户端地址:", client_addr)server.close()

2. 客户端实现

客户端通过UDP协议发送完整的数据报,服务端可以直接接收并处理。客户端发送数据时使用sendto指定目标IP地址和端口。

import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8084))client.sendto('world'.encode('utf-8'), ('127.0.0.1', 8084))client.close()

三、UDP与TCP的区别

1. 连接性

UDP协议是无连接的,客户端和服务端的通信不需要建立连接,任意一方可以随时发送数据。

2. 数据处理方式

UDP协议的数据报包含数据部分和头信息,服务端接收到的数据可能为空,但数据报头仍然有效。因此,服务端可以通过接收数据报的头信息判断是否有有效数据。

3. 数据可靠性

UDP协议不保证数据的可靠传输。如果客户端发送的数据在传输过程中丢失,服务端将无法接收到完整的数据。这种特性使得UDP协议适用于对数据丢失不敏感的场景。

四、案例

1. 基于UDP协议的时间格式化服务器

服务端接收客户端发送的时间格式化字符串,并返回格式化后的时间。

from socket import *from time import strftimeserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8908))print("服务器已启动,等待客户端连接...")while True: msg, addr = server.recvfrom(1024) if not msg: fmt = "%Y-%m-%d %X" else: fmt = msg.decode("utf-8") time_fmt = strftime(fmt) server.sendto(time_fmt.encode("utf-8"), addr)server.close()

客户端实现:from socket import *client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)ip_port = ('127.0.0.1', 8908)while True:inp = input("请输入时间格式(例如:%Y-%m-%d):").strip()client.sendto(inp.encode("utf-8"), ip_port)date = client.recv(1024)print(date.decode("utf-8"))client.close()

2. 基于UDP协议的米聊功能实现

通过UDP协议实现多用户之间的实时聊天,服务端接收客户端的消息并转发给目标用户。

服务端实现:import socketip_port = ('127.0.0.1', 8081)udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_server.bind(ip_port)print("服务器已启动,等待消息...")while True:message, addr = udp_server.recvfrom(1024)print(f"来自[{addr[0]}:{addr[1]}]的消息:{message.decode('utf-8')}")response = input("输入回复消息:").strip()if response:udp_server.sendto(response.encode('utf-8'), addr)else:breakudp_server.close()

客户端实现:import socketudp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True:chat_name = input("请选择聊天对象:").strip()while True:message = input("请输入消息,回车发送:").strip()if message == 'quit':breakif not message:continuetarget_ip_port = {"淘小欣": ("127.0.0.1", 8881),"shawn": ("127.0.0.1", 8881),"派大星": ("127.0.0.1", 8881),"派大星的真心话": ("127.0.0.1", 8881)}[chat_name]udp_client.sendto(message.encode('utf-8'), target_ip_port)response, addr = udp_client.recvfrom(1024)print(f"来自[{addr[0]}:{addr[1]}]的回复:{response.decode('utf-8')}")if response:breakif message == 'quit':breakudp_client.close()

转载地址:http://rtto.baihongyu.com/

你可能感兴趣的文章
vue3+Element-plus icon图标无法显示的问题(已解决)
查看>>
NodeJS实现跨域的方法( 4种 )
查看>>
nodejs封装http请求
查看>>
nodejs常用组件
查看>>
nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
查看>>
Nodejs异步回调的处理方法总结
查看>>
NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
查看>>
nodejs支持ssi实现include shtml页面
查看>>
Nodejs教程09:实现一个带接口请求的简单服务器
查看>>
nodejs服务端实现post请求
查看>>
nodejs框架,原理,组件,核心,跟npm和vue的关系
查看>>
Nodejs概览: 思维导图、核心技术、应用场景
查看>>
nodejs模块——fs模块
查看>>
Nodejs模块、自定义模块、CommonJs的概念和使用
查看>>
nodejs生成多层目录和生成文件的通用方法
查看>>
nodejs端口被占用原因及解决方案
查看>>
Nodejs简介以及Windows上安装Nodejs
查看>>
nodejs系列之express
查看>>
nodejs系列之Koa2
查看>>
Nodejs连接mysql
查看>>