说明
广播发送数据,代码与单播几乎相同,只是发送的地址是:向广播地址
广播地址
广播地址是通过本机ip与子网掩码算出来的,在java中可以直接获取到,详见 链接
代码
package 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.SocketException;
/**
*
*
* 编写一个聊天的工具
* 有收数据部分,和发数据部分
* 这两个不部分同时执行
* 就需要多线程技术
* 一个线程控制收,一个线程控制发
*
* 因为收和发动作是不一致的,所以要定义两个方法
* 而且这两个方法要封装到不同的类中
*
* @author 言曌
* @date 2017/12/6 下午8:25
*/
class Send3 implements Runnable {
private DatagramSocket socket;
public Send3(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufferedReader.readLine()) != null) {
byte[] buff = line.getBytes();
DatagramPacket packet = new DatagramPacket(buff,buff.length, InetAddress.getByName("192.168.168.255"),10001);
socket.send(packet);
if("bye".equals(line)) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Rece3 implements Runnable {
private DatagramSocket socket;
public Rece3(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while(true) {
byte[] buff = new byte[1024];
DatagramPacket packet = new DatagramPacket(buff,buff.length);
socket.receive(packet);
String ip = packet.getAddress().getHostAddress();
String data = new String(packet.getData(),0,packet.getLength());
if("bye".equals(data)) {
System.out.println(ip+"离开了");
}
System.out.println(ip+"说"+data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ChatDemo3 {
public static void main(String args[]) throws SocketException {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket reveSocket = new DatagramSocket(10001);
new Thread(new Send3(sendSocket)).start();
new Thread(new Rece3(reveSocket)).start();
}
}
参考:
https://blog.csdn.net/liu_yanzhao/article/details/79796671