java udp广播DatagramSocket编程

说明

广播发送数据,代码与单播几乎相同,只是发送的地址是:向广播地址

广播地址

广播地址是通过本机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