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

UDP数据报套接字编程

1.1UDP编程原理

          对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。Java中使用UDP协议通信,主要基于DatagramSocket类来发送或接收数据报套接字,并使用DatagramPacket作为创建的UDP数据报,DatagramPacket类对象就是UDP协议中Socket的数据报。 

1.2 DatagramSocket API

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

(1) DatagramSocket 构造方法:

(2)DatagramSocket 方法: 

1.3DatagramPacket类

(1)DatagramPacket构造方法

构造方法如下:

 

(2)DatagramPacket普通方法 

2.1服务器端代码

public class EchoServer {//服务器端
    //1、创建一个DatagramSocket对象
    DatagramSocket socket = null;
    public EchoServer(int port) throws SocketException {//服务器端需要自己指定端口号
        socket = new DatagramSocket(port);//这么写就是手动指定端口号
        //socket = new DatagramSocket();//这么写就是系统自动分配端口号
    }
 
    public void start() throws IOException {
        System.out.println("服务器启动...");
        while (true){
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            //requestPacket这个对象是用来承载数据的,在创建的时候需要创建一块内存空间来保存数据
            socket.receive(requestPacket);
            //当前完成的receive之后,数据是以二进制的形式存储到DatagramPacket中
            //还需要把这个二进制的数据转化成字符串的形式
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            //范围为0到requestPacket.getLength(),requestPacket.getLength()表示数据的真实长度
            //2、根据请求,计算响应(服务器端最核心的作用)
            String response = process(request);
            //3、把响应写回到客户端
            //搞一个响应对象,DatagramPacket
            //把DatagramPacket构造刚才的数据,再通过send返回
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    0,
                    response.getBytes().length,
                    requestPacket.getSocketAddress());//指定数据内容,同时指定数据要发给谁
            socket.send(responsePacket);
            //4、打印一个日志,把这次的数据交互的详情给打印出来
            System.out.printf("[%s:%d] req = %s,resp = %s\n",
                    responsePacket.getAddress().toString(),
                    responsePacket.getPort(),
                    request,
                    response);
        }
    }
    public String process(String request) {//请求是啥样,响应就是啥样
        //回转响应的方法
        return request;
    }
    public static void main(String[] args) throws IOException {
        EchoServer server = new EchoServer(9090);//实例测试
        server.start();
    }
}

 2.2客服端代码

public class EchoClient {//客户端
    private DatagramSocket socket = null;
    private String serverIP = "";
    private int serverPort = 0;
    public EchoClient(String ip,int port) throws SocketException {
        //创建这个对象不能手动指定端口
        socket = new DatagramSocket();
        //由于 UDP自身不会持有对端信息,就需要在应用程序里,把对端的情况给记录下来
        //这里咱们主要记录对端的ip和端口
        serverIP = ip;
        serverPort = port;
    }
    public void start() throws IOException {
        System.out.println("客户端启动...");
        Scanner scanner = new Scanner(System.in);
        while (true){
            //1、控制台读取数据,作为请求
            System.out.println(" -> ");
            String request = scanner.next();
            //2、把请求的内容构造成DatagramSocket对象,发送给服务器
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length,
                    InetAddress.getByName(serverIP),
                    serverPort);
            socket.send(requestPacket);
            //3、尝试获取服务器响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //4、把响应给转换出字符串,并显示出来
            String response = new String(responsePacket.getData(),
                    0,
                    responsePacket.getLength());
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        EchoClient client = new EchoClient("127.0.0.1",9090);
        client.start();
    }
}

2.3运行结果

 


http://www.kler.cn/a/271867.html

相关文章:

  • 【Git版本控制器--3】Git的远程操作
  • 【软件架构】软件的十二种架构简介
  • 技术之翼,创作之心
  • 三、双链表
  • 安装MeloTTS报错解决方法
  • Baklib助力企业如何搭建内容中台的全新策略解析
  • python类对象
  • HarmonyOS鸿蒙开发常用4种布局详细说明
  • [Java、Android面试]_07_继承与多态、重写与重载
  • django 定时任务的创建
  • js中怎样添加、移出、插入、复制、创建?
  • Python中的变量是什么类型?
  • Java学习笔记(15)
  • 【工具】一键生成动态歌词字幕
  • 国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney
  • 【LeetCode热题100】 94. 二叉树的中序遍历(二叉树)
  • 前端框架vue的样式操作,以及vue提供的属性功能应用实战
  • 介绍一款鼠标无边界软件
  • RUST egui部署到github
  • 计算机原理(基础02)
  • 三大排序(插入排序,选择排序,冒泡排序)
  • Python 查找并高亮PDF中的指定文本
  • webpack一些常用的Loader和Plugin
  • 二叉树的初步学习和顺序结构实现
  • 解决: java.util.concurrent.CancellationException详解
  • 鲸鱼优化算法改进风储机组一次调频出力分配系数,以频率偏差最小为目标优化函数,结合鲸鱼算法WOA捕食过程,改进风储出力分配系数simulink与matlab联合