UDP通信
特点:无连接、不可靠通信
不事先建立连接;发送端每次把要发送的数据(限制在64kB内),接收端IP等信息封装成一个数据包,发出去就不管了
Java提供了一个java.net.DatagramSocket
类来实现UDP通信
DatagramSocket
:用于创建客户端、服务端
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建客户端的Socket对象,系统会随机分配一个端口号 |
public DatagramSocket(int port) | 创建服务端的Socket对象,并指定端口号 |
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive(DatagramPacket p) | 使用数据包接收数据 |
DatagramPacket
:创建数据包
构造器 | 说明 |
---|---|
public DatagramPacket(byte[] buf,int length,InetAddress address,int port | 创建发出去的数据包对象 |
public DatagramPacket(byte[] buf,int length) | 创建用来接收数据的数据包 |
方法 | 说明 |
---|---|
public int getLength() | 获取数据包,实际接收到的字节个数 |
一发一收
package d1_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception {
DatagramSocket server = new DatagramSocket(9870);
byte[] bytes = new byte[1024 * 64];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
server.receive(datagramPacket);
int length = datagramPacket.getLength();
String s = new String(bytes,0,length);
System.out.println(s);
// System.out.println(datagramPacket.getAddress().getHostAddress());
//
// System.out.println(datagramPacket.getPort());
server.close();
}
}
package d1_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket client = new DatagramSocket();
byte[] bytes = "我是客户端".getBytes();
InetAddress localHost = InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, localHost, 9870);
client.send(datagramPacket);
System.out.println("客户端数据发送完毕");
client.close();
}
}
多发多收
package d2_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception {
DatagramSocket server = new DatagramSocket(9870);
byte[] bytes = new byte[1024 * 64];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
while (true) {
server.receive(datagramPacket);
int length = datagramPacket.getLength();
String s = new String(bytes,0,length);
System.out.println(s);
}
}
}
package d2_udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket client = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请说");
String msg = scanner.next();
byte[] bytes = msg.getBytes();
if("exit".equals(msg)){
System.out.println("欢迎下次光临,退出成功");
client.close();
break;
}
InetAddress localHost = InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, localHost, 9870);
client.send(datagramPacket);
}
}
}