首页 > 编程语言 >Java笔记(14) UDP通讯程序Demo

Java笔记(14) UDP通讯程序Demo

时间:2023-04-08 17:34:18浏览次数:43  
标签:DatagramSocket UDP DatagramPacket Java 14 packet 地址 端口号

实现一个简单的UDP通信程序,仅作为笔记使用
网络编程中有三要素:IP、端口号和通信协议,分别用来确定对方在互联网上的地址、指定接受数据的软件和确定数据在网络中传输的规则。

IP地址

IP地址分为IPv4地址和IPv6地址,这里不做讨论。
IPv4地址中分为公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有地址,范围是192.168.0.0--192.168.255.255。另外还有一个特殊地址:127.0.0.1,也可以是localhost,称为回送地址,也称本机IP。与在局域网中被分配的IPv4地址来说,该地址永远指向自身,而分配的IP地址,有可能随着连接时间和地点的变换而变换。

端口号

端口号是应用程序在设备中唯一的标识,有两个字节标识的整数组成,因此取值范围为065535。其中01023之间的端口固定用于一些知名的网络服务或者应用。一个端口号只能被一个应用占用。

协议

互联网通信协议分为OSI参考模型和TCP/IP参考模型,这里不做讨论。
两种运行在传输层的协议:

  • UDP协议:用户数据包协议(User Datagram Protocol)。UDP是面向无连接的通信协议。速度较快,但有大小限制,一次最多发送64k,是数据不安全的,易丢失数据。
  • TCP协议:传输控制协议(Transmission Control Protocol)。TCP协议是面向连接的通信协议。速度相较于UDP较慢,但没有大小限制,是数据安全的。

UDP通信程序流程

发送数据

  1. 创建发送端的 DatagramSocket对象
  2. 数据打包 DatagramPacket
  3. 发送数据
  4. 释放资源

接收数据

  1. 创建接收端的 DatagramSocket
  2. 接收打包好的数据
  3. 解析数据包
  4. 释放资源

UDP-Sender实现

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建发送端的 DatagramSocket,空参表示不指定端口,随机使用可用端口
        DatagramSocket socket = new DatagramSocket();

        //2. 将数据封装进 DatagramPacket 对象中,作为发送者,需要指定接收方的IP和接受端口号
        String str = "Hello";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("HIIBIRD");//get target IP address
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10086);

        //3. 发送打包的数据包
        socket.send(packet);

        //4. 端口号资源是有限的,发送完成后释放端口号
        socket.close();
    }
}

UDP-Receiver实现

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建接收端的 DatagramSocket,作为接收方,需要指定使用哪个接口进行接受
        DatagramSocket socket = new DatagramSocket(10086);

        //2.接收打包好的数据,由于数据通过DatagramPacket对象发送,接收端也需要创建一个DatagramPacket对象来接收
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

        //这个方法是阻塞的,程序会一致在这里等待
        socket.receive(packet);

        //3. 解析数据,接收方可以得到以下信息:发送的数据包、数据长度、发送发地址、发送方使用的端口号
        byte[] data = packet.getData();
        int len = packet.getLength();
        InetAddress address = packet.getAddress();
        int port = packet.getPort();

        System.out.println("Received data: " + new String(data, 0, len));
        System.out.println("This data was send from " + port + "port of the " + address + " computer");

        //4. 释放资源
        socket.close();
    }
}

需要先运行接收端程序,接收程序阻塞等待接受数据。然后运行发送端程序,发送数据。
UDP

标签:DatagramSocket,UDP,DatagramPacket,Java,14,packet,地址,端口号
From: https://www.cnblogs.com/hiibird/p/17298810.html

相关文章

  • Day02 - JavaScript + CSS Clock
    Day02-JavaScript+CSSClock作者:©liyuechun简介第二天的练习是用JS+CSS模拟时钟效果。效果如下:实现以上模拟时钟的效果,大致思路和解决方案如下:分别获取到当前时间的时、分、秒。通过时分秒对一圈360度,进行映射,确定每一个指针所需旋转的角度。通过CSS的transform:rotate(deg),......
  • 『0014』 - Solidity Types - 动态大小字节数组(Dynamically-sized byte array)
    作者:黎跃春,一、Dynamically-sizedbytearraystring是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。bytes动态字节数组,引用类型。根据经验,在我们不确定字节数据大小的情况下,我们可以使用string或者bytes,而如果我们清楚的知道或者......
  • JavaScript 中使用正则表达式的方法
    目录使用方法常见的使用方法test()exec()match()replace()split()使用方法在JavaScript中,正则表达式可以用字面量语法创建。字面量语法是一种非常简单直观的表示正则表达式的方式。它使用两个斜杠(/)括起来,如下所示:constregex=/pattern/;例如,要匹配字母a和b之间的所有字......
  • Java的jar包依赖版本冲突解决
    参考:https://blog.csdn.net/weixin_38898423/article/details/128178055https://blog.csdn.net/Yal_insist/article/details/127669985一、依赖冲突不同的第三方jar包可能同时对某一个jar包的不同版本含有依赖,但是Maven解析pom.xml文件时,同一个jar包只会保留一个Maven默认处理策略......
  • 【Java】数组
    数组是编程语言中常见的数据结构,用来存储一组相同数据类型的数据,可以通过整型索引访问数组中的每一个值。需要注意,同一个数组中存储的所有元素的数据类型必须相同。根据数组存放元素的组织结构,可将数组分为一维数组、二维数组以及多维(三维及以上)。创建数组:data_type[]varName;......
  • JavaScript 数组笔记
    添加和删除数组项添加push()push()方法:向数组的末尾添加一个或多个元素,并返回修改后的数组长度。语法:arr.push(element1[,...[,elementN]])参数:element1,...,elementN:要添加到数组末尾的元素。示例:constfruits=['apple','banana','orange'];constnewLength......
  • Java笔记(六):设计原则
    SOLID原则是面向对象设计和编程中的一组基本原则,其中SOLID分别是以下五个原则的首字母缩写:单一职责原则(SingleResponsibilityPrinciple,SRP)。一个类或者模块只应该有一个单一的责任。这个原则告诉我们,一个类应该只负责一项功能,不要试图把太多的职责塞到一个类里面。开闭......
  • java中的引用
    引用分类强引用强引用是我们常见的普通对象引用,只有还有强引用指向一个对象,就表明这个对象还“存活”,垃圾收集器不会碰这个对象当一个对象被强引用对象引用时,它就处于可达状态,它是不能被垃圾回收的,即使出现了OOM也不会对该对象回收软引用软引用是相对于强引用......
  • JAVA实现单链表修改和删除数据节点
    JAVA实现单链表修改和删除数据节点一、修改单链表中的一个节点①实现思路因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。通过遍历链表,使辅助节点temp后移,找到要修改的节点......
  • Java-SPI机制详解
    Java之SPI机制详解1:SPI机制简介SPI全称是ServiceProviderInterface,是一种JDK内置的动态加载实现扩展点的机制,通过SPI技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是一种设计理念。2:SPI原理JavaSPI实际上是基于接口的编程+策略模......