《java入门第一季》之UDP协议下的网络编程小案例

时间:2023-03-09 15:53:22
《java入门第一季》之UDP协议下的网络编程小案例

需求,一台电脑发送数据,其他电脑都可以收到该数据。使用广播地址。

发送端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress; /*
* 数据来自于键盘录入
* 键盘录入数据要自己控制录入结束。
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket(); // 封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//封装输入功能
String line = null;
while ((line = br.readLine()) != null) {//line是输入的数据
if ("886".equals(line)) {//结束条件
break;
} // 创建数据并打包
byte[] bys = line.getBytes();
// DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.12.92"), 12345);
// DatagramPacket dp = new DatagramPacket(bys, bys.length,
// InetAddress.getByName("192.168.1.103"), 12345);//因为发送端给定IP,所以只能打给103这个人,不能发给别人。为了演示发给多个人看下一节代码
//这里的IP是目的地址的IP。
//为了让所有人(只要是在这个局域网之内的人)接收端都能收到信息,发送端写广播地址192.168.1.255
DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.1.255"),12345);
// 发送数据
ds.send(dp);
} // 释放资源
ds.close();
}
}

接收端我又开了两台电脑同样的程序。代码如下:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; /*
* 多次启动接收端:
* java.net.BindException: Address already in use: Cannot bind
* 端口被占用。
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端的Socket对象,要给出一个要接收的端口号
DatagramSocket ds = new DatagramSocket(12345); while (true) {//代表接收多次
// 创建一个包裹
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length); // 接收数据
ds.receive(dp);//把接收到的数据存放到了dp里面 // 解析数据
String ip = dp.getAddress().getHostAddress();
//String s = new String(dp.getData(), 0, dp.getLength());
String s = new String(bys,0,dp.getLength());//dp.getLength()实际发送的字节有多大
System.out.println("from " + ip + " data is : " + s);
} // 释放资源
// 接收端应该一直开着等待接收数据,是不需要关闭
// ds.close();
}
}

此时在发送端电脑发送数据,其他两台电脑均收到了输入的数据。