JavaUDP通信程序

news/2024/5/18 14:26:40 标签: udp, 网络, java

2 UDP通信程序

2.1 UDP通信原理

  • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象, 但是这两个Socket只是发送,接收数据的对象因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念

  • Java提供了DatagramSocket类作为基于UDP协议的Socket

2.2 UDP发送数据

  • 发送数据的步骤
    • 1、创建发送端的Socket对象(DatagramSocket):DatagramSocket()
    • 2、创建数据, 并把数据打包:DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
    • 3、调用DatagramSocket对象的方法发送数据:void send(DatagramPacket p)
    • 4、关闭发送端:void close()
  • 范例
java">package test;

import java.io.IOException;
import java.net.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        //1、创建发送端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();

        //2、创建数据, 并把数据打包
        //DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
        // 构造一个数据包,发送长度为length的数据 包到指定主机上的指定端口号。
        byte[] bys = "hello,java".getBytes();
        DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);

        //3、调用DatagramSocket对象的方法发送数据
        //void send(DatagramPacket p)
        ds.send(dp);

        //4、关闭发送端
        ds.close();
    }
}

2.3 UDP接收数据

  • 接收数据的步骤
    • 1、创建接收端的Socket对象(DatagramSocket):DatagramSocket(int port)
    • 2、创建一个数据包, 用于接收数据:DatagramPacket(byte[] buf, int length)
    • 3、调用DatagramSocket对象的方法接收数据:void receive(DatagramPacketp)
    • 4、解析数据包, 并把数据在控制台显示:byte[] getData()int getLength()
    • 5、关闭接收端:void close()
java">package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //1、创建接收端的Socket对象(DatagramSocket):DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(10086);

        //2、创建一个数据包, 用于接收数据
        //DatagramPacket(byte[] buf, int length):构造一个DatagramPacket用来接收长度为length的数据包
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);

        //3、调用DatagramSocket对象的方法接收数据:void receive(DatagramPacketp)
        ds.receive(dp);

        //4、解析数据包, 并把数据在控制台显示:
        // byte[] getData():返回数据缓冲区 int getLength()
        byte[] datas = dp.getData();
        //int getlength():返回要发送的数据长度或接收的数据长度
        int len = dp.getlength();
        String dataString = new String(datas,0,len);
        System.out.println("数据是:"+dataString);

        //5、关闭接收端:void close()
        ds.close();
    }
}

2.4 范例

在这里插入图片描述

  • 发送端
java">package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //1、创建发送端的Socket对象(DatagramSocket):DatagramSocket()
        DatagramSocket ds = new DatagramSocket();

        //键盘录入数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;

        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            } else {
                //创建数据并把数据打包
                byte[] bys = line.getBytes();
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 1001);

                //3、调用DatagramSocket对象的方法发送数据:void send(DatagramPacket p)
                ds.send(dp);
            }
        }

        ds.close();
    }
}
  • 接收端
java">package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建接收端的Socket对象(DatagramSocket):DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(1001);

        while(true) {
            //创建一个数据包接收数据
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            //调用DatagramSocket对象的方法接收数据:void receive(DatagramPacketp)

            ds.receive(dp);


            //解析数据包, 并把数据在控制台显示:byte[] getData()、int getLength()
            System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
        }

        //关闭
//        ds.close();
    }
}

http://www.niftyadmin.cn/n/91384.html

相关文章

面试 | 递归乘法【细节决定成败】

不用[ * ]如何使两数相乘❓一、题目明细二、思路罗列 & 代码解析1、野蛮A * B【不符合题意】2、sizeof【可借鉴】解析3、简易递归【推荐】① 解析&#xff08;递归展开图&#xff09;② 时间复杂度分析4、移位<<运算【有挑战性&#x1f4aa;】① 思路顺理② 算法图解…

双指针 (C/C++)

1. 双指针 双指针算法的核心思想&#xff1a;将暴力解法的时间复杂度&#xff0c;通常是O(N*N)&#xff0c;通过某种特殊的性质优化到O(N)。 做题思路&#xff1a;先想想暴力解法的思路&#xff0c;然后分析这道题的特殊性质&#xff0c;一般是单调性。然后得出双指针算法的思路…

华为OD机试 C++ 实现 - 任务混部

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

浅谈CAS原理。

文章目录1.场景引入&#xff0c;问题凸现2.更高效的方案&#xff1a;AtomicXXXX 原子类3.什么是CAS&#xff1f;4.CAS的缺点5.遗留的两个问题&#xff1a;6.ABA问题7.ABA问题解决8.小结1.场景引入&#xff0c;问题凸现 示例程序&#xff1a;启动两个线程&#xff0c;每个线程中…

MySQL 数据库基础命令

MySQL 基础命令 一.了解数据库 1、了解数据库对象 1.表&#xff1a; 用于以有组织方式存储数据。以行和列的格式包含数据。 2.索引&#xff1a; 是内部表结构&#xff0c;MySQL 用它基于一列或多列的值来提供对表中各行的快速访问。 3.视图&#xff1a; 是虚拟表&#…

【python】用plotly绘制正二十面体

文章目录顶点棱实现正二十面体plotly 的 Python 软件包是一个开源的代码库&#xff0c;它基于 plot.js&#xff0c;而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库&#xff0c;名叫 cufflinks&#xff0c;能让你更方便地使用 plotly 和 Pandas 数据表协同工作…

2023年全国最新道路运输从业人员精选真题及答案4

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 41.根据《道路旅客运输及客运站管理规定》规定&#xff0c;客运…

qt 可视化ui设计

QMainWindow 是主窗口类&#xff0c;主窗口类具有主菜单栏、工具栏和状态栏&#xff0c;类似于一般的应用程序的主窗口&#xff1b;QWidget是所有具有可视界面类的基类&#xff0c;选择QWidget创建的界面对各种界面组件都可以支持&#xff1b;QDialog是对话框类&#xff0c;可建…