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. 转: div:给div加滚动条 div的滚动条设置

    div 的滚动条问题: 两种方法: 一. <div style=" overflow:scroll; width:400px; height:400px;”></div&g ...

  2. Scala 可变长参数

    Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号. 例如:定义一个可变参数的函数param def pa ...

  3. Spring Cloud Feign设计原理

    什么是Feign? Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直 ...

  4. Landsat数据下载与介绍

    1 数据下载 根据时间选择不同的Landsat卫星传感器 根据经纬度选择对应的条带: Lansdat Analysis Ready Data (ARD) Tile Conversion Tool: 把 ...

  5. POJ1149_PIGS(网络流/EK)

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15721   Accepted: 7021 Description ...

  6. vue echart例——柱状图及高度自适应

    1.安装 npm install echarts -s 2.例——点击tab切换时柱状图重绘,高度根据返回数据设置. <template> <div> <ul id=&q ...

  7. unity3D笔记の四种调用其他脚本方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名() 第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

  8. Buy Low, Buy Lower

    Buy Low, Buy Lower 给出一个长度为N序列\(\{a_i\}\),询问最长的严格下降子序列,以及这样的序列的个数,\(1 <= N <= 5000\). 解 显然我们可以很 ...

  9. AOP-面向切面编程-1

    将方法类比成一个积木,哪里需要执行插到哪里 视野角度就是将一个程序比作几条绳子的集合,每个集合是一堆方法的集合,那么把绳子截断,绳子的切面就是一堆方法中一个方法与另一个方法的交界处,将你需要的方法切入 ...

  10. undertow服务器

    参考地址:http://undertow.io/undertow-docs/undertow-docs-1.3.0/index.html 1.引入相关jar <dependencies> ...