1. UDP特性
- 不需要建立连接 但不稳定
- 没有明确的客户端和服务端的区别‘
- 发送方不管接受方的状态
2. 示例代码
2.1 UDP消息发送
package TestUDP;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class TestUDPSent01 {
public static void main(String[] args) throws Exception {
DatagramSocket datagramSocket = new DatagramSocket();
String msg ="hello";
InetAddress localhost = InetAddress.getByName("127.0.0.1");
int port=9000;
DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(StandardCharsets.UTF_8), 0, msg.length(), localhost, port);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
package TestUDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TestUDPRecive01 {
public static void main(String[] args) throws Exception {
DatagramSocket datagramSocket = new DatagramSocket(9000);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
datagramSocket.close();
}
}
2.2 UDP聊天实现
package TestUDP;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class TestUDPSend02 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9000);
while (true){
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String data = reader.readLine();
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length,new InetSocketAddress("localhost",9001));
socket.send(datagramPacket);
if(data.equals("bye")){
break;
}
}
socket.close();
}
}
package TestUDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TestUDPRecive02 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9001);
while (true){
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);
byte[] data = packet.getData();
String reciveData = new String(data,0,packet.getLength());
System.out.println(reciveData);
if(reciveData.equals("bye")){
break;
}
}
socket.close();
}
}
2.3 UDP多线程在线咨询
package TestUDP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class ChatUDPSend implements Runnable {
DatagramSocket socket = null;
BufferedReader reader = null;
private int fromPort;
private String toIp;
private int toProt;
public ChatUDPSend(int fromPort, String toIp, int toProt) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toProt = toProt;
try {
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
String data = reader.readLine();
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length,new InetSocketAddress(this.toIp,this.toProt));
socket.send(datagramPacket);
if(data.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
package TestUDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ChatUDPRecive implements Runnable{
DatagramSocket socket =null;
private int port;
private String msgFrom;
public ChatUDPRecive(int port,String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);
byte[] data = packet.getData();
String reciveData = new String(data,0,packet.getLength());
System.out.println(msgFrom+":"+reciveData);
if(reciveData.equals("bye")){
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
socket.close();
}
}
package TestUDP;
public class ChatTeacher {
public static void main(String[] args) {
new Thread(new ChatUDPSend(6666,"localhost",8888)).start();
new Thread(new ChatUDPRecive(9999,"student")).start();
}
}
package TestUDP;
public class ChatStudent {
public static void main(String[] args) {
new Thread(new ChatUDPSend(7777,"localhost",9999)).start();
new Thread(new ChatUDPRecive(8888,"teacher")).start();
}
}