当前位置: 首页 > news >正文

【网络编程】UDP Socket编程

UDP Socket编程

  • 一. DatagramSocket
  • 二. DatagramPacket
  • 三. InetSocketAddress
  • 四. 执行流程
  • 五. 代码示例: UDP 回显服务器

数据报套接字: 使用传输层 UDP 协议

UDP: 即 User Datagram Protocol(用户数据报协议),传输层协议。

UDP的特点:

  1. 无连接
  2. 不可靠传输
  3. 面向数据报
  4. 全双工
  5. 有接收缓冲区,无发送缓冲区
  6. 大小受限:一次最多传输64k

对于数据报来说,可简单理解为,传输的数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。

一. DatagramSocket

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。

构造方法:

在这里插入图片描述

方法:

在这里插入图片描述

二. DatagramPacket

DatagramPacket是UDP Socket发送和接收的数据报。

构造方法:

在这里插入图片描述

方法:

在这里插入图片描述

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。

三. InetSocketAddress

InetSocketAddress 是SocketAddress 的子类

构造方法:

在这里插入图片描述

四. 执行流程

对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下:

在这里插入图片描述

五. 代码示例: UDP 回显服务器

服务器端代码:

class UdpEchoServer {public DatagramSocket socket;//udp的服务器需要自己指定端口号public UdpEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("启动服务器");while(true){//三个步骤//1.接受客户端发来的请求//先构造出数据报(盘子)DatagramPacket requestPacket=new DatagramPacket(new byte[1024],1024);//接收数据socket.receive(requestPacket);//输出型参数, receive 会将数据填充到 requestPacket 中//将数据报解析成一个字符串String request=new String(requestPacket.getData(),0,requestPacket.getLength(),"UTF-8");//注意这里求的长度直接用的是数据报//2.根据请求计算出响应String response=process(request);DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,//注意长度是字节数组的长度requestPacket.getSocketAddress());//注意要加上IP地址和端口,这里合起来写了//3.响应返回给客户端socket.send(responsePacket);System.out.printf("[reqIP:%s  req端口号:%d][req:%s  resp:%s]\n",requestPacket.getAddress().toString(),responsePacket.getPort(),request,response);}}/***  根据请求计算响应, 这里面只是模拟, 直接返回了原字符串*/public String process(String request){return request;}public static void main(String[] args) throws SocketException {UdpEchoServer udpEchoServer=new UdpEchoServer(9090);try {udpEchoServer.start();} catch (IOException e) {throw new RuntimeException(e);}}
}

客户端代码:

class UdpEchoClient {public DatagramSocket socket;//服务器的IP地址和端口号,传送数据时需要知道,放在数据报中public String serverIp;public int ServerPort;public UdpEchoClient(String serverIp,int serverPort) throws SocketException {socket=new DatagramSocket();//客户端利用系统随机分配的端口号,防止自己手动的端口号不能用this.serverIp=serverIp;this.ServerPort=serverPort;}public void start() throws IOException {Scanner scanner=new Scanner(System.in);while(true){//五个步骤//1.先接收用户输入的字符串System.out.println("->");String request=scanner.next();//2.构造数据报//注意数据报中除了数据内容还要包含服务器IP和端口DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIp),ServerPort);//3.客户端发送数据报给服务器socket.send(requestPacket);//4.从服务器接收响应,并解析DatagramPacket responsePacket=new DatagramPacket(new byte[1024],1024);socket.receive(responsePacket);//解析数据String response=new String(responsePacket.getData(),0,responsePacket.getLength(),"UTF-8");//同样注意这里求长度用的也是数据报//5.打印在控制台上System.out.printf("req:%s resp:%s\n",request,response);}}public static void main(String[] args) throws IOException {//如果服务器在其他机器上就需要将IP地址和端口号更改了UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",9090);udpEchoClient.start();}
}

注意:当然要先启动服务器再启动客户端啦!

好啦! 以上就是对 UDP Socket编程的讲解,希望能帮到你 !
评论区欢迎指正 !

http://www.lryc.cn/news/170242.html

相关文章:

  • [GIT]版本控制工具
  • Linux文件管理命令
  • Netty面试题(三)
  • risc-v dv源代码分析
  • C语言基础语法复习07-c语言关键字的解释
  • 阿里巴巴全店商品采集教程,阿里巴巴店铺所有商品接口(详解阿里巴巴店铺所有商品数据采集步骤方法和代码示例)
  • Android 白天黑夜模式设置
  • FFMpeg zoompan 镜头聚焦和移动走位
  • 利用hutool工具类实现验证码功能
  • 前端面试题: 请解释什么是函数的作用域?
  • 华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析
  • Nginx配置SSL证书
  • 一,安卓aosp源码编译环境搭建
  • video 视频编解码一些debug方法
  • 中秋国庆假期——模板推荐
  • 【配代码演示】Cookie和Session的区别
  • 【Linux初阶】信号入门2 | 信号阻塞、捕捉、保存
  • 【已解决】:该该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)“按钮获取它的所有权。否则,请按“取消(C)“按钮以防损坏。
  • 系统架构常用的工具
  • 腾讯云2核4G服务器5M带宽 218元一年 优惠价格明细表
  • [C++ 网络协议] 多播与广播
  • IOS17正式版今日发布
  • 2560. 打家劫舍 IV
  • java web中部署log4j.xml
  • 【张兔兔送书第一期:考研必备书单】
  • 基于Spring Boot+ Vue的健身房管理系统与实现
  • ThreadLocal线程局部变量
  • C++ Primer (第五版)第一章习题部分答案
  • Python与GUI集成:零基础也能开发国际象棋游戏
  • SaaS软件能保证数据安全吗?