Java之UDP编程

DatagramSocket概述

上次在Java网络套接字Socket编程那篇博客里只写了Socket和ServerSocket,即TCP通信,这次来补充一下UDP通信。

和Socket类似的,Java中也存在一个DatagramSocket类,它就是面向UDP中的数据报包的概念传输,对应java.net包下面有一个类DatagramPacket就是用来描述数据报包。

因为UDP是无连接的,不分客户端和服务端,在单次通信中,只有发送端和接收端,因此也没有什么DatagramServerSocket

DatagramSocket使用

DatagramSocket():建立一个udp socket,它实际上是调用了DatagramSocket(new InetSocketAddress(0)),即指定端口号为0,0的含义是这个端口号是根据系统指定动态生成的。

其他构造函数就是和Socket类似的传一个端口号进去、传一个SocketAddress进去。

bind:绑定端口

connect:虽然udp是无连接的,但可以只与同一台机器通信,这种情况也称它为connect,connect之后所有的send和receive操作都与指定的主机通信。

send:发送一个DatagramPacket数据报包

receive:接收一个数据报包,这个方法是阻塞的。

close:释放socket

需要注意的是receive方法需要传入一个数据报包对象,这个数据报包对象由一个空的字节数组构造,而字节数组的长度值得考虑,如果过小可能会造成数据截断,所以发送方和接收方最好对数据包的大小制定约定规范。

示例:

@Test
public void testSend() throws IOException {
    DatagramSocket socket = new DatagramSocket();

    byte[] msg = "hello".getBytes();
    DatagramPacket packet = new DatagramPacket(msg, 0, msg.length, new InetSocketAddress("localhost", 12306));

    socket.send(packet);
    socket.close();
}

@Test
public void testReceive() throws IOException {
    DatagramSocket socket = new DatagramSocket(12306);
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer,0, buffer.length);
    socket.receive(packet);

    System.out.println(packet.getPort());
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
}

DatagramChannel

需要了解的是,UDP本身就不存在什么阻塞,不需要连接,只在receive的时候会阻塞等待数据报。使用DatagramChannel可以设置非阻塞,则在从DatagramChannel中读数据报的时候如果没有数据报,就可以立即返回null。

相关API:public abstract SocketAddress receive(ByteBuffer dst) throws IOException;

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/java%e4%b9%8budp%e7%bc%96%e7%a8%8b/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年3月11日
下一篇 2020年3月11日

相关推荐

  • JDK8新增高效原子累加器LongAdder源码分析

    很久以前写过CAS应用之JUC下的原子类,但是LongAdder这个类没有去看,只是给了一个其他博客的参考链接。今天就自己来分析一下。 AtomicLong的问题和LongAdde…

    2020年5月19日
    0780
  • 深入理解java虚拟机第三版读书笔记02

    以下是第二章 Java内存区域与内存溢出异常的内容 运行时数据区域 程序计数器 特点 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 程序计数器是…

    2020年1月5日
    0210
  • 为什么说Java只有值传递?

    先说一下。。以后可能不会怎么写Java相关的博客了,因为找到了字节跳动的实习工作,用Go/Python开发后端,所以这几天在抓紧时间学Go,在学Go的时候,了解到Go语言只有值传递…

    Java 2020年6月26日
    03170
  • Java自动装箱缓存机制

    尝试运行这段代码: 相似的两段代码,得到的结果却完全不相同。 首先要知道在java中==比较的是对象的引用,从直觉出发,无论是integer1、integer2还是integer3…

    Java 2019年12月5日
    0180
  • 日志门面介绍和JCL使用

    日志门面概述 之前有写过Java日志框架JUL和Log4j介绍,可以对比发现它们之间的使用还是有一些区别的,比如有一些类名是不同的、日志的输出级别也不完全一致。 那么实际上是增大了…

  • Java8避免空指针异常Optional类的使用

    最近都是一天写一篇算法题解,好久没有写过博客了,不知道写啥了而且快到期末考试了。。 今天介绍一个Java8的特性:Optional类,这个类我平时也不咋用,今天来研究一下。 Opt…

    Java 2020年6月3日
    0660
  • 深入理解java虚拟机第三版读书笔记12

    以下是第十二章 Java内存模型与线程的内容 硬件的效率与一致性 基于高速缓存的存储交互很好地解决了处理器与内存速度之间的矛盾,但是也为计算机系统带来更高的复杂度,它引入了一个新的…

    2020年1月29日
    01540
  • 基于NIO模型改进多人聊天室

    第一版和第二版见基于BIO模型实现多人聊天室 NIO介绍见: NIO、BIO模型对比实现文件的复制NIO网络编程之Selector介绍 第三版:使用NIO模型改进 服务端实现 pu…

    Java 2020年2月7日
    0200
  • JavaIO-缓冲流与转换流

    缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedO…

    Java 2020年2月4日
    0130
  • Java中的四种内部类

    我发现最近真是越来越没有东西写了。。。不可能天天学习新知识啊,最近在复习阶段了,复习的东西大多数是博客里写过的/(ㄒoㄒ)/ 复习Java基础的时候认真看了一下Java的内部类,这…

    Java 2020年5月23日
    0100

发表回复

登录后才能评论