1. UDP编程:

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

1.1 客户端

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

1.2 服务端:

    DatagramSocket ds = new DatagramSocket(9090);
for( ; ; ){
//接收
byte[] buffer = new buffer[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
//发送
byte[] data = ...;
packet.setData(data);
ds.send(packet);
}

1.3 实例

TCPClient.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets; public class UDPClient {
public static void main(String[] args) throws Exception{
InetAddress addr = InetAddress.getLoopbackAddress();
try(DatagramSocket sock = new DatagramSocket()){
sock.connect(addr,9090);
byte[] data = "time".getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(data,data.length);
sock.send(packet);
System.out.println("Data was sent");
Thread.sleep(1000);
byte[] buffer = new byte[1024];
DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
sock.receive(resp);
byte[] respData = resp.getData();
String respText = new String(respData,0,resp.getLength());
System.out.println("Response:"+respText);
}
}
}

TCPServer.java

package com.crazy;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime; public class UDPServer {
public LocalDateTime currentTime(){
return LocalDateTime.now();
}
public static void main(String[] args) throws Exception{
DatagramSocket ds = new DatagramSocket(9090);
System.out.println("UDP server ready");
for(;;){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
ds.receive(packet);
byte[] data = packet.getData();
String s = new String(data, StandardCharsets.UTF_8);
System.out.println("Pack received from : "+packet.getSocketAddress());
String resp = LocalDateTime.now().toString();
packet.setData(resp.getBytes(StandardCharsets.UTF_8));
ds.send(packet);
}
}
}

先运行server



再运行client

2. 总结:

UDP编程模型:

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

最新文章

  1. SDWebImage下载图片有时候无法成功显示出来
  2. chrome(谷歌浏览器)老是提示此文件可能损害计算机
  3. html图片和文字的细节
  4. JavaScript DOM-Ready 机制
  5. GDI相关函数
  6. [转]Even when one byte matters
  7. .net 中的相等性比较
  8. Jenkins中的一些问题解决(~~不断更新~~)
  9. python CSS
  10. iOS学习笔记--触摸事件
  11. Java异常处理-----自定义异常
  12. python 最大连续子数组的和
  13. 欧拉筛,线性筛,洛谷P2158仪仗队
  14. 连续子数组最大和(python)
  15. P3747 相逢是问候 欧拉定理+线段树
  16. jupyter notebook添加Anaconda虚拟环境的python kernel
  17. WebRTC网关服务器单端口方案实现
  18. mac 10.12显示隐藏文件
  19. Codeforces Round #476 (Div. 2) [Thanks, Telegram!] C
  20. Java:二进制(原码、反码、补码)与位运算

热门文章

  1. mysql中的Date日期格式的问题:只有日期没有时间及格式化时间
  2. ZK4字命令
  3. (转)linux下装tomcat
  4. Day 12 :迭代器与生成器
  5. SpringMVC(day1搭建SpringWebMvc项目)
  6. 《移山之道》第十一章:两人合作 读书笔记 PB16110698 第六周(~4.15)
  7. Spark运行基本流程
  8. log4j.rootLogger
  9. Got permission denied while trying to connect to the Docker daemon
  10. 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据