DatagramSocket 此类表示用来发送和接收数据报包的套接字。
DatagramPacket 此类表示数据报包
public DatagramPacket(byte[] buf,
int length,
InetAddress address,
int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
参数:
buf - 包数据。
length - 包长度。
address - 目的地址。
port - 目的端口号。
- 发送端:
- 建立UDP的服务
- 准备数据,封装到数据包中
- 调用UDP的服务,发送数据包
- 关闭资源
package com.network.test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
* DatagramPacket(buf,length,address,port)
*/
public class DemoSender {
public static void main(String[] args) throws SocketException, IOException{
//建立UDP的服务
DatagramSocket datagramSocket=new DatagramSocket(8888);
//准备数据,把数据封装到数据包中
String data="这是我的第一个UDP例子...";
DatagramPacket packet=new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getLocalHost(),9090);
//调用UDP的服务发送数据包
datagramSocket.send(packet);
//关闭资源 释放占用的端口号
datagramSocket.close();
}
}
- 接收端:
- 建立UDP的服务
- 准备空的数据包接收数据
- 调用UDP的服务接收数据
- 关闭资源
package com.network.test;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.io.IOException;
public class DemoReceive {
public static void main(String[] args) throws IOException{
//建立UDP的服务,并且要监听一个端口
DatagramSocket socket=new DatagramSocket(9090);
//准备空的数据包用于存储数据
byte[] buf=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(buf,buf.length);
//调用UDP的服务接收数据
socket.receive(datagramPacket);//数据实际上是存到byte数组中了
System.out.println("接收端接收到的数据:"+new String(buf,0,datagramPacket.getLength()));
//关闭资源
socket.close();
}
}
要先开启接收端
UDP群聊例子
package com.network.test;
import java.io.*;
import java.net.*;
import java.io.IOException;
//发送端
public class ChatSender extends Thread{
public void run(){
try{
//建立UDP服务
DatagramSocket socket=new DatagramSocket();
//准备数据,把数据封装到数据包中发送
BufferedReader keyReader=new BufferedReader(new InputStreamReader(System.in));
String line=null;
DatagramPacket packet=null;
while((line=keyReader.readLine())!=null){
packet=new DatagramPacket(line.getBytes(),line.getBytes().length,InetAddress.getByName("123.207.45.54"),9092);
//调用UDP服务发送数据包
socket.send(packet);
}
//关闭资源
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
package com.network.test;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
//接收端
public class ChatReceive extends Thread {
@Override
public void run() {
try {
// 建立UDP服务,监听一个端口
DatagramSocket socket = new DatagramSocket(9092);
// 准备空的数据包存储数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
boolean flag = true;
while (flag) {
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress()+" say:"+new String(buf, 0, packet.getLength()));
}
// 关闭资源
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.network.test;
public class ChatMain {
public static void main(String[] args){
ChatReceive chatReceive=new ChatReceive();
chatReceive.start();
ChatSender chatSender=new ChatSender();
chatSender.start();
}
}