java的UDP
- DatagramSocket 和 DatagramPacket 两个类是 基于UDP 协议进行通信的包装类
- 实现两个客户端通过 UDP协议通信,使用DatagramSocket 和 DatagramPacket类
案例1:从Send发送数据给Receive,当输入的内容为quit,结束线程
1.发送Send
- 创建DatagramSocket,随机端口号
- 创建DatagramSocket,制定数据,长度,地址,端口
- 使用DatagramSocket发送DatagramPacket
- 关闭DatagramSocket
2.接收Receive
- 创建DatagramSocket,制定端口号
- 创建DatagramPacket,制定数组,长度
- 使用DatagramSocket接收DatagramPacket
- 关闭DatagramSocket
- 从DatagramPacket中获取数据
Send
public class UdpSend2 {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//2.从键盘录入
Scanner sc = new Scanner(System.in);
while(true) {
String line = sc.nextLine();
if("quit".equals(line)) {
break;
}
DatagramPacket packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
socket.send(packet);
}
socket.close();
}
}
Receive
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive2 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6666);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while(true) {
socket.receive(packet);
byte[] arr = packet.getData();
int len = packet.getLength();
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
System.out.println(ip + ":" + port + ":" + new String(arr, 0, len));
}
// socket.close();
}
}
结果:
Send:
今天是个好天气,适合出去玩!
Receive:
127.0.0.1:54438:今天是个好天气,适合出去玩!
案例2:UDP在多线程中的应用 , 在案例1的基础上使用了线程
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class MoreThread {
public static void main(String[] args) {
new Receive().start();
new Send().start();
}
}
class Receive extends Thread {
DatagramSocket socket;
@Override
public void run() {
// TODO Auto-generated method stub
try {
socket = new DatagramSocket(6666);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while(true){
try {
socket.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //接货
byte[] arr = packet.getData(); //获取数据
int len = packet.getLength(); //获取有效的字节个数
String ip = packet.getAddress().getHostAddress(); //获取ip地址
int port = packet.getPort();
System.out.println(ip + ":" + port + ":" + new String(arr, 0, len));
}
}
}
class Send extends Thread{
DatagramSocket socket;
DatagramPacket packet;
@Override
public void run() {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in); //创建键盘录入对象
try {
socket = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //创建Socket,相当于创建码头
//创建Packet,相当于集装箱
while(true){
String line = s.nextLine(); //获取键盘录入的字符串
if("quit".equals(line)){
break;
}
try {
packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
socket.send(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
socket.close();
}
}
结果:
how are you today?
127.0.0.1:60780:how are you today?
i stay at home alone. i am very boring.
127.0.0.1:60780:i stay at home alone. i am very boring.
let's go out paly
127.0.0.1:60780:let's go out paly