DatagramSocket 此类表示用于发送和接收数据报数据包的套接字。
DatagramPacket 该类表示数据报包。
DatagramSocket
DatagramSocket构造方法
DatagramSocket常用方法
DatagramSocket常用方法
DatagramPacket 构造方法 确定创建接受 还是发送的数据包
构造方法
方法
建立UDP发送端
1 建立可以实现UDP传输的socket服务
2 明确具体发送的数据
3 通过socket服务将具体的数据发送出去
4 关闭服务
public class UDPSend_test {
public static void main(String[] args) throws IOException {
// 创建UDP服务
DatagramSocket ds=new DatagramSocket();
// 明确数据
String str="UDP 来了";
// 发送数据 将数据封装到数据包中
byte[] buf=str.getBytes();
// 将数据封装到数据包对象中 数据包会明确目的地址 和端口
// 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
DatagramPacket dp=new DatagramPacket(buf,buf.length,
InetAddress.getByName("192.168.1.6"),10000);
// 将数据包发送
ds.send(dp);
// 关闭udp服务
ds.close();
}
}
创建接收端
创建socket服务 给接收端明确端口
收数据
将其中所需要的数据取出来 ip data 端口
public class UDPRece_test {
public static void main(String[] args) throws IOException {
/** 创建接受端
* 创建socket服务 给接受端明确端口
* 收数据
* 将其中所需要的数据取出来 ip data 端口*/
// 使用socket的接收方法 接收数据
DatagramSocket ds=new DatagramSocket(10000);
// 使用socket的接收方法 接收数据 需要将接到的数据存储到数据包中
// 可以通过数据包对象的方法对收到的数据进行解析
// 创建数据包
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
// 通过数据包的方法解析收到的数据 使用数据包的方法
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String s=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+"---"+s);
ds.close();
}
}
实例:
聊天室
通过UDP协议
一个负责发送数据任务 一个负责接收数据任务 两个任务同时执行 需要多线程
public class UDP_test {
public static void main(String[] args) throws SocketException {
// 创建发送端 并明确端口
DatagramSocket send=new DatagramSocket(10002);
// 创建接收端 并明确端口
DatagramSocket rece=new DatagramSocket(10001);
new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start();
}
}
//负责发送的任务 通过UDPsocket 发送
class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
// 1.要发送的数据来自于哪里 键盘
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
// 读取数据
String line=null;
while (true)
{
try {
if (!((line=br.readLine())!=null))break;
} catch (IOException e) {
e.printStackTrace();
}
// 2.将数据封装到数据包中
byte[] bytes=line.getBytes();
DatagramPacket dp= null;
try {
// 明确接收端的ip地址 和端口
dp = new DatagramPacket(bytes,bytes.length,
InetAddress.getByName("192.168.1.6"),10001);
} catch (UnknownHostException e) {
e.printStackTrace();
}
// 3.数据包发送
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
if ("over".equals(line)){
break;
}
}
ds.close();
}
}
//负责接收的任务
class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run(){
while (true) {
// 接收的数据要存储到数据包中 而数据包中有字节数组
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
// 将收到的数据存储到数据包重
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String ip = dp.getAddress().getHostAddress();
String data = new String(bytes, 0, dp.getLength());
System.out.println(ip + ":" + data);
if ("over".equals(data)) {
System.out.println(ip + "离开聊天室");
}
}
}
}
网友评论