廖雪峰Java13网络编程-1Socket编程-5UDP编程
2024-10-04 23:35:40
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流接口
最新文章
- SDWebImage下载图片有时候无法成功显示出来
- chrome(谷歌浏览器)老是提示此文件可能损害计算机
- html图片和文字的细节
- JavaScript DOM-Ready 机制
- GDI相关函数
- [转]Even when one byte matters
- .net 中的相等性比较
- Jenkins中的一些问题解决(~~不断更新~~)
- python CSS
- iOS学习笔记--触摸事件
- Java异常处理-----自定义异常
- python 最大连续子数组的和
- 欧拉筛,线性筛,洛谷P2158仪仗队
- 连续子数组最大和(python)
- P3747 相逢是问候 欧拉定理+线段树
- jupyter notebook添加Anaconda虚拟环境的python kernel
- WebRTC网关服务器单端口方案实现
- mac 10.12显示隐藏文件
- Codeforces Round #476 (Div. 2) [Thanks, Telegram!] C
- Java:二进制(原码、反码、补码)与位运算
热门文章
- mysql中的Date日期格式的问题:只有日期没有时间及格式化时间
- ZK4字命令
- (转)linux下装tomcat
- Day 12 :迭代器与生成器
- SpringMVC(day1搭建SpringWebMvc项目)
- 《移山之道》第十一章:两人合作 读书笔记 PB16110698 第六周(~4.15)
- Spark运行基本流程
- log4j.rootLogger
- Got permission denied while trying to connect to the Docker daemon
- 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据