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日

相关推荐

  • Java基础查缺补漏04

    继续我的复习刷题 接口方法可以使用abstract修饰 问题: java接口的方法修饰符可以为?(忽略内部接口) A. privateB. protectedC. finalD. …

    Java 2020年5月28日
    0200
  • ThreadPoolExecutor源码分析-线程池如何实现线程复用?

    线程的复用问题 在开始看线程池的源码之前,先来看这么一个问题: 一个Thread对象可以重复地调用start()方法吗? 试试就知道了: @Test public void tes…

    2020年5月21日
    02880
  • 深入理解java虚拟机第三版读书笔记01

    做笔记之前的感言 谈到《深入理解java虚拟机》,在业内可太有名了,是国内的一位大神写的一本关于java虚拟机的畅销书,基本上对java稍有深入的程序员都听说过这本书。不过遗憾的是…

    2020年1月4日
    0310
  • NIO零拷贝与其系统函数调用

    本文参考资源: Java NIO学习笔记四(零拷贝详解)Java拿笔小星的博客-CSDN博客 关于Buffer和Channel的注意事项和细节 ByteBuffer不止可以存取by…

    2020年3月14日
    0540
  • ArrayList源码分析

    总结 总结放前面防止太长不看: ArrayList内部是用数组实现的。 如果使用无参构造函数建立ArrayList,在添加第一个元素的时候会分配10个元素的空间。 ArrayLis…

    2019年11月22日
    0160
  • 深入理解java虚拟机第三版读书笔记04

    以下是第三章 垃圾收集器与内存分配策略的内容 概述 程序计数器、虚拟机栈、本地方法栈是线程独有的,栈帧更是随方法结束而消亡,不需要垃圾回收。而堆和方法区则需要经过垃圾回收的设计 对…

    2020年1月8日
    0320
  • Java反射机制和动态代理详解

    反射 概念 反射机制: 指的是可以于运行时加载、探知、使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性…

    Java 2020年2月15日
    0600
  • Java中的File类以及IO流

    File 类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 构造方法 public File(String path…

    Java 2020年2月4日
    0150
  • 深入理解java虚拟机第三版读书笔记02

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

    2020年1月5日
    0210
  • NIO底层原理-epoll

    BIO模型存在三个socket: ServerSocket:专门用来监听是否有来自客户端的连接accept返回的Socket:专门用于处理客户端请求的socketSocket:客户…

    Java 2020年2月13日
    0110

发表回复

登录后才能评论