1. UDP编程:

  • 不需要建立连接
  • 可以直接发送和接收数据

1.1 客户端

  1. DatagramSocket sock = new DatagramSocket(){}
  2. sock.connect(addr,9090);//并不建立连接
  3. //接收
  4. byte[] data=...;
  5. DatagramPacket packet = new DatagramPacket(data, data.length);
  6. sock.send(packet);
  7. //发送
  8. byte[] buffer = new byte[1024];
  9. DatagramPacket resp = new DatagramPacket(buffer, buffer.length);
  10. sock.receive(resp);
  11. //接收和发送都是通过DatagramPacket实现的

1.2 服务端:

  1. DatagramSocket ds = new DatagramSocket(9090);
  2. for( ; ; ){
  3. //接收
  4. byte[] buffer = new buffer[1024];
  5. DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
  6. ds.receive(packet);
  7. //发送
  8. byte[] data = ...;
  9. packet.setData(data);
  10. ds.send(packet);
  11. }

1.3 实例

TCPClient.java

  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetAddress;
  4. import java.nio.charset.StandardCharsets;
  5. public class UDPClient {
  6. public static void main(String[] args) throws Exception{
  7. InetAddress addr = InetAddress.getLoopbackAddress();
  8. try(DatagramSocket sock = new DatagramSocket()){
  9. sock.connect(addr,9090);
  10. byte[] data = "time".getBytes(StandardCharsets.UTF_8);
  11. DatagramPacket packet = new DatagramPacket(data,data.length);
  12. sock.send(packet);
  13. System.out.println("Data was sent");
  14. Thread.sleep(1000);
  15. byte[] buffer = new byte[1024];
  16. DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
  17. sock.receive(resp);
  18. byte[] respData = resp.getData();
  19. String respText = new String(respData,0,resp.getLength());
  20. System.out.println("Response:"+respText);
  21. }
  22. }
  23. }

TCPServer.java

  1. package com.crazy;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.nio.charset.StandardCharsets;
  5. import java.time.LocalDateTime;
  6. public class UDPServer {
  7. public LocalDateTime currentTime(){
  8. return LocalDateTime.now();
  9. }
  10. public static void main(String[] args) throws Exception{
  11. DatagramSocket ds = new DatagramSocket(9090);
  12. System.out.println("UDP server ready");
  13. for(;;){
  14. byte[] buffer = new byte[1024];
  15. DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
  16. ds.receive(packet);
  17. byte[] data = packet.getData();
  18. String s = new String(data, StandardCharsets.UTF_8);
  19. System.out.println("Pack received from : "+packet.getSocketAddress());
  20. String resp = LocalDateTime.now().toString();
  21. packet.setData(resp.getBytes(StandardCharsets.UTF_8));
  22. ds.send(packet);
  23. }
  24. }
  25. }

先运行server



再运行client

2. 总结:

UDP编程模型:

  • 客户端使用DatagramSocket.connect()指定远程地址和端口
  • 服务器端用DatagramSocket(port)监听端口
  • 双方通过receive/send读写数据
  • 没有IO流接口

廖雪峰Java13网络编程-1Socket编程-5UDP编程的更多相关文章

  1. 廖雪峰Java13网络编程-1Socket编程-2TCP编程

    1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据 ...

  2. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  3. 廖雪峰Java13网络编程-1Socket编程-1网络编程概念

    1.计算机网络 1.1 什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 1.2 什么是互联网 互联网是网络的网络 互联网采用 ...

  4. 廖雪峰Java13网络编程-3其他-2RMI远程调用

    1.RMI远程调用: Remote Method Invocation 目的:把一个接口方法暴露给远程 示例: 定义一个接口Clock,它有一个方法能够获取当前的时间,并编写一个实现类,来实现这个接口 ...

  5. 廖雪峰Java13网络编程-3其他-1HTTP编程

    1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...

  6. 廖雪峰Java13网络编程-2Email编程-2接收Email

    1接收Email协议类型 接收Email:收件人通过MUA软件把邮件从MDA抓取到本地计算机的过程. 1.1 POP3 从MUA到MDA使用最广泛的是协议是POP3 Post Office Proto ...

  7. 廖雪峰Java13网络编程-2Email编程-1发送email

    1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...

  8. 廖雪峰Java1-3流程控制-9break、continue

    break跳出循环 int sum=0; for(int i=1; ;i++) { sum =sum + i; if(i == 100) { break; } } System.out.println ...

  9. 廖雪峰Java1-3流程控制-6 do-while循环

    do-while循环 do-while先执行循环,再判断条件. 条件满足时继续循环:条件不满足时退出:至少循环1次 int sum =0; int n = 1; do{ sum = sum + n; ...

随机推荐

  1. Java-杂项-java.nio:java.nio

    ylbtech-Java-杂项-java.nio:java.nio java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有 ...

  2. 漏洞验证系列--MongoDB未授权访问

    本系列文章旨在对于有一定网络安全基础的人员,在日常工作中扫描出来的各种漏洞,如何进行验证,以区分该漏洞是否存在或是扫描器误报.请勿应用非法途径. 本漏洞是由于MongoDB未设置访问权限,用户可以直接 ...

  3. [01]APUE:sysconf / pathconf

    sysconf / pathconf:用于运行时确定特定系统实际支持的限制值 sysconf 函数的参数格式: “_SC_ + 限制项名称”,如:CHILD_MAX 限制值指每个实际用户 ID 可以启 ...

  4. 搞懂这7个Maven问题,带你吊打面试官!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:张丰哲 www.jianshu.com/p/20b39ab6a88c 在如今的互联网项目开发当中,特别是Java领域, ...

  5. Java设计模式(一)外观模式(门面模式)- 结构型模式

    模式的定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下:要求一个子系统的外部与其内部通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得 ...

  6. 19-Ubuntu-文件和目录命令-删除文件和目录-rm

    rm 删除文件或目录 注:使用rm命令要小心,因为文件删除后不能恢复.不会放在垃圾箱里,直接从磁盘删除. 选项 含义 -f 强制删除文件,无需提示.不能删除目录! -r 递归的删除目录下的内容,删除文 ...

  7. 2018 年 -- 15 个有意思的 JavaScript 和 CSS 库

    在Tutorialzine上你可以了解最新最酷的Web发展趋势.这就是为什么每个月都会发布一些偶然发现并认为值得你关注的最佳资源的缘由. Direction Reveal (方向展示) 该插件检测光标 ...

  8. vue echarts 给饼图中间添加文字 ,并且添加多个样式

    最近根据设计要求写了一个统计图,以下是设计要求,要求中间文字分别是总数和汉字,样式分别不同 好吧具体的解决方案如下 方案一 series: [ { type:'pie', radius: ['50%' ...

  9. Leetcode274.H-IndexH指数

    原题的中文翻译不是很好,所以给出英文版. Given an array of citations (each citation is a non-negative integer) of a rese ...

  10. 从零开始:Mysql基于Amoeba的集群搭建

    从零开始:Mysql基于Amoeba的集群搭建 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.amoeba-mysql-binary-2.0. ...