首页 > 编程语言 >05. UDP编程

05. UDP编程

时间:2023-10-31 18:33:37浏览次数:33  
标签:UDP socket 05 编程 udp 服务器 接字 客户端

一、什么是UDP协议

  相对于 TCP 协议,UDP 协议则是面向无连接的协议。使用 UDP 协议时,不需要建立连接,只需要知道对象的 IP 地址和端口号,就可以直接发数据包。但是,数据无法保证一定到达。虽然用 UDP 传输数据不可靠,但它的优点是比 TCP 协议的速度快。对于不要求可靠到达的数据而言,就可以使用 UDP 协议。

UDP通信

UDP 每次发送数据的时候,都需要写上接收方的 IP 和 PORT;

二、创建UDP服务器

  创建 UDP 服务器的伪代码如下:

import socket                       # 导入socket模块

ss =  socket.socket()               # 创建服务器套接字
ss.bind()                           # 套接字与地址绑定

while True:                         # 监听连接
   cs = ss.recvfrom()/ss.sendto()   # 对话(接收/发送)

ss.close()                          # 关闭服务器套接字

  UDP 和 TCP 服务器之间的一个显著差异是,因为数据报套接字是无连接的,所以就没有为了通信成功而使一个客户端连接到一个独立的套接字 “转换” 的操作。这些服务器仅仅接收消息,并有可能回复数据。

from socket import socket
from socket import AF_INET, SOCK_DGRAM, SOL_SOCKET, SO_REUSEADDR
from time import ctime

HOST = "127.0.0.1"
PORT = 8080
ADDRESS = (HOST, PORT)

udp_server = socket(AF_INET, SOCK_DGRAM)                        # 创建服务器套接字
udp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)              # 解决端口占用问题
udp_server.bind(ADDRESS)                                        # 套接字与地址绑定

while True:                                                     # 通信循环
    recv_data, client_addr = udp_server.recvfrom(1024)          # 服务端接收消息,单次最大接收为1024个字节
    print(f"收到客户端【{client_addr}】数据:{recv_data.decode('utf-8')}")
    udp_server.sendto(f"【{ctime()}】 {recv_data.decode('utf-8')}".encode("utf-8"), client_addr)     # 服务端发送消息

udp_server.close()                                              # 关闭服务器套接字

  对 socket() 的调用的不同之处仅仅在于,我们现在需要一个 数据报/UDP 套接字类型,但是 bind() 的调用方式与 TCP 服务器版本的相同。因为 UDP 是无连接的,所以这里没有调用 “监听传入的连接”。

三、创建UDP客户端

  创建 UDP 服务器的伪代码如下:

import socket                       # 导入socket模块

cs =  socket.socket()               # 创建客户端套接字

while True:                         # 通信循环
    cs.sendto()/cs.recvfrom()       # 对话(发送/接收)

cs.close()                          # 关闭客户端套接字

  UDP 客户端循环工作方式几乎和 TCP 客户端一样。唯一的区别是,事先不需要建立与 UDP 服务器的连接,只是简单的发送一条消息并等待服务器的回复。

from socket import socket
from socket import AF_INET, SOCK_DGRAM

HOST = "127.0.0.1"
PORT = 8080
ADDRESS = (HOST, PORT)

udp_client = socket(AF_INET, SOCK_DGRAM)                            # 创建客户器套接字

while True:                                                         # 通信循环
    send_data = input("请输入要发送的数据: ").strip()
    udp_client.sendto(send_data.encode("utf-8"), ADDRESS)           # 客户端发送数据

    recv_data, server_addr = udp_client.recvfrom(1024)              # 客户端接收数据,单次最大接收为1024个字节
    print(f"收到服务端【{server_addr}】返回的数据:{recv_data.decode('utf-8')}")

udp_client.close()                                                  # 关闭客户端套接字

四、执行UDP服务器和客户端

  如果先运行客户端,那么将无法进行任何连接,因为没有服务器等待接受请求。服务器可以视为一个被动伙伴,因为必须首先建立自己,然后被动的等待连接。另一方面,客户端是一个主动的合作伙伴,因为它主动发起一个连接。换句话说,首先启动服务器(在任何客户端试图连接之前)。

  在开发中,创建这种 “友好的” 退出方式的一种方法就是,将服务器的 while 循环放在一个 try-except 语句中的 except 子句中,并监控 EOFError 或 KeyboardInterrupt 异常,这样你就可以在 except 或 finally 子句中关闭服务器的套接字。

标签:UDP,socket,05,编程,udp,服务器,接字,客户端
From: https://www.cnblogs.com/kurome/p/17800970.html

相关文章

  • 学编程如何赚钱?翔知盈
    在技术公司工作 。当你掌握了编程技能,你可以在一些技术公司中找到工作,例如Google、Microsoft、IBM等,这些公司通常提供高薪和良好的福利。做游戏开发者 。如果你对游戏开发感兴趣,你可以尝试开发自己的游戏,并在Steam、App Store等平台上销售或提供付费服务。做网站开发者 。网......
  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......
  • 无代码:让编程不再有门槛
    随着数字化时代的到来,一种全新的开发方式正在崛起,它就是无代码开发。通过简单的拖拽和配置,无代码平台-kepler能让没有编程经验的人,快速构建出功能强大的应用程序,从而改变了传统软件开发的模式。Kepler无代码是一种可视化编程工具,让用户通过拖拽组件和配置参数等方式,快速构建应用程......
  • 05_搭建静态资源服务器
    一、Node环境搭建Node.js简介​ Node.js是一个开源与跨平台的JavaScript运行时环境。它是一个可用于几乎任何项目的流行工具!​ Node.js在浏览器外运行V8JavaScript引擎(GoogleChrome的内核)。这使Node.js表现得非常出色。​ Node.js应用程序运行于单个进程中,无需......
  • 实验3 C语言函数应用编程
    一,实验目的二,实验准备三,实验内容1,实验任务1task1.c1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<Windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);//函数声明8voidprint_spaces(intn);//......
  • 响应式编程
    响应式编程(ReactiveProgramming)什么是ReactorReactor是一个用于JVM的完全非阻塞的响应式编程框架,具备高效的需求管理(即对“背压(backpressure)”的控制)能力。它与Java8函数式API直接集成,比如CompletableFuture,Stream,以及Duration。它提供了异步序列APIFlux(用于[N]个......
  • C# Socket网络编程
    入门级C#Socket编程实现只要知道要通信的两台主机的IP地址和进程的端口号,然后可以用Socket让这两个进程进行通信。在本机上运行服务端和客户端,ip为127.0.0.1,使用端口9050(0~1023的端口号通常用于一些比较知名的网络服务和应用,普通网络应用程序则应该使用1024以上的端口号,以避免......
  • 重新使用android studio编写udp socket程序,备忘记录
    1,建立socket需要使用子线程而不是主线程。2,java/android使用数据报格式。3,可以利用python作为socket的客户/服务器端,非常简单。但python可以不使用数据报,而直接使用字符串。当然也可以使用数据报。当与android配合时使用数据报格式4,一般地,传输的是字符串,因此,数字要编码为字符串......
  • 实验3 C语言函数应用编程
    实验任务11#include<stdio.h>2#include<math.h>3#include<stdlib.h>4#include<time.h>5#include<windows.h>6#defineN807voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidpr......
  • 实验3 C语言函数应用编程
    一、实验目的能正确使用c语法规则定义、声明、调用函数能正确编写递归函数针对具体问题场景,能合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性、可维护性针对具体问题场景,能正确、合理使用全局变量和局部static变量,解决实际问题二、实验准备函数定义、声......