UDP:以数据为中心 非面向连接 不安全 数据可能丢失 效率高
一.类 DatagramSocket DatagramPacket
1.客户端:
a).创建DatagramSocket 类 + 指定端口
b).准备数据 字节数据
c).打包DatagramPacket + 服务器地址及端口
d).发送
e).释放资源
2.服务器端
a).创建 服务端 DatagramSocket 类 + 指定端口
b).准备接收的容器 字节数组 封装 DatagramPacket
c).包 接收数据
d). 分析数据
e).释放资源
二.源代码
MyServer.java
package com.kennosaur.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 服务端
* 1.创建服务端+端口
* 2.准备接受容器
* 3.封装成 包DatagramPacket(byte[] buf, int length)
* 4.接受数据
* 5.分析数据
* 6.释放资源
* @author Administrator
*
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//1.创建服务端+端口
DatagramSocket server = new DatagramSocket(8888);
//2.准备接受容器
byte[] container = new byte[1024];
//3.封装成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet = new DatagramPacket(container, container.length);
//4.接受数据
server.receive(packet);
//5.分析数据
byte[] data = packet.getData();
int len = packet.getLength();
System.out.println(new String(data,0,len));
//6.释放资源
server.close();
}
}
MyClient.java
package com.kennosaur.net.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 客户端
* 1.创建客户端+端口
* 2.准备数据
* 3.打包(发送的地点及端口) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
* 4.发送
* 5.释放
* @author Administrator
*
*/
public class MyClient {
public static void main(String[] args) throws IOException {
//1.创建客户端+端口
DatagramSocket client = new DatagramSocket(6666);
//2.准备数据
String msg = "UDP编程";
byte[] data = msg.getBytes();
//3.打包(发送的地点及端口) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
//4.发送
client.send(packet);
//5.释放
client.close();
}
}
三.发送double数据类型 -----将double类型转化为字符数组byte[]后传递
Server.java
package com.kennosaur.net.udp;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 服务端
* 1.创建服务端+端口
* 2.准备接受容器
* 3.封装成 包DatagramPacket(byte[] buf, int length)
* 4.接受数据
* 5.分析数据 字节数组--->double 字节数组输入流
* 6.释放资源
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) throws IOException {
//1.创建服务端+端口
DatagramSocket server = new DatagramSocket(8888);
//2.准备接受容器
byte[] container = new byte[1024];
//3.封装成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet = new DatagramPacket(container, container.length);
//4.接受数据
server.receive(packet);
//5.分析数据
// byte[] data = packet.getData();
// int len = packet.getLength();
// System.out.println(new String(data,0,len));
double data = convert(packet.getData());
System.out.println(data);
//6.释放资源
server.close();
}
/**
* 字节数组+Data输入流
* @param data
* @return
* @throws IOException
*/
public static double convert(byte[] data) throws IOException {
DataInputStream dis = new DataInputStream(
new ByteArrayInputStream(data));
double num = dis.readDouble();
dis.close();
return num;
}
}
Client.java
package com.kennosaur.net.udp;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 客户端
* 1.创建客户端+端口
* 2.准备数据 double--->字节数组 字节数组输出流
* 3.打包(发送的地点及端口) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
* 4.发送
* 5.释放
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) throws IOException {
//1.创建客户端+端口
DatagramSocket client = new DatagramSocket(6666);
//2.准备数据
// String msg = "UDP编程";
// byte[] data = msg.getBytes();
double num = 89.12;
byte[] data = convert(num);
//3.打包(发送的地点及端口) DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
//4.发送
client.send(packet);
//5.释放
client.close();
}
/**
* 字节数组 数据源+data输出流
* @param num
* @return
* @throws IOException
*/
public static byte[] convert(double num) throws IOException {
byte[] data = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeDouble(num);
dos.flush();
data = bos.toByteArray();
dos.close();
return data;
}
}