UDP 实现多收多发,广播发送,组播发送 TCP 实现多收多发

TCP 实现多收多发(上线下线提醒)

创建发送端

public static void main(String[] args) throws IOException {
    System.out.println("客户端");
    // 创建客户端对象
    Socket socket = new Socket("192.168.43.1", 7771);
    // 创建低级输出流并转高级
    PrintStream ps = new PrintStream(socket.getOutputStream());
    // 创建输入
    Scanner sc = new Scanner(System.in);
    while (true){
        System.out.println("请说:");
        ps.println(sc.nextLine());
        // 刷新
        ps.flush();
    }

}

创建接收端

public static void main(String[] args) throws IOException {
   // 创建服务端
   // 调用连接方法
   ServerSocket server = new ServerSocket(7771);
   while (true) {
       Socket accept = server.accept();
       // 当用户到了这里,说明已经上线准备发送数据了
       // 上线提醒应该在这里
       System.out.println(accept.getRemoteSocketAddress() + "上线啦!!!");
       new MyTherad(accept).start();
   }
}

创建多线程

public class MyTherad extends Thread {
    private Socket accept;

    public MyTherad(Socket socket) {
        this.accept = socket;
    }

    @Override
    public void run() {
        // 把低级流转换高级流
        try {
            BufferedReader buff = new BufferedReader(new InputStreamReader(accept.getInputStream()));
            String msg;
            while ((msg = buff.readLine()) != null) {
                // 打印了
                System.out.println(accept.getRemoteSocketAddress() + "说了:" + msg);
            }

        } catch (IOException e) {
            System.out.println(accept.getRemoteSocketAddress() + "离线啦!!!");
        }
    }
}

使用线程池优化多收多发的代码

创建接收端

public static void main(String[] args) throws IOException {
    // 创建服务端
    ServerSocket server = new ServerSocket(7771);
    // 创建线程池 3 个核心 5个最大,预留五个准备空位
    ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 6, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(3), new ThreadPoolExecutor.AbortPolicy());
    while (true) {
        // 调用连接方法
        Socket accept = server.accept();
        // 当用户到了这里,说明已经上线准备发送数据了
        // 上线提醒应该在这里
        System.out.println(accept.getRemoteSocketAddress() + "上线啦!!!");
        pool.execute(new MyTherad(accept));;
    }
}

创建发送端

public static void main(String[] args) throws IOException {
    // 创建客户端
    Socket socket = new Socket("192.168.43.1", 7771);
    // 创建打印流
    PrintStream ps = new PrintStream(socket.getOutputStream());
    Scanner sc = new Scanner(System.in);
    while (true){
        String s = sc.nextLine();
        if(s.equals("exit")){
            System.exit(0);
        }
        ps.println(s);
    }
}

创建线程

public class MyTherad extends Thread {
    private final Socket accept;

    public MyTherad(Socket socket) {
        this.accept = socket;
    }

    @Override
    public void run() {
        // 把低级流转换高级流
        try {
            BufferedReader buff = new BufferedReader(new InputStreamReader(accept.getInputStream()));
            String msg;
            while ((msg = buff.readLine()) != null) {
                // 打印了
                System.out.println(accept.getRemoteSocketAddress() + "说了:" + msg);
            }

        } catch (IOException e) {
            System.out.println(accept.getRemoteSocketAddress() + "离线啦!!!");
        }
    }
}

UDP多收多发

创建发送端

public static void main(String[] args) throws IOException {
    // 创建发送端
    DatagramSocket data = new DatagramSocket();
    Scanner sc = new Scanner(System.in);

    while (true){
        System.out.println("请说:");
        String s = sc.nextLine();
        if(s.equals("exit")){
            data.close();
            break;
        }
        // 写入数据
        byte[] bytes = s.getBytes();
        // 创建数据包
        DatagramPacket pack = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getLocalHost(), 6666);
        data.send(pack);
    }

}

创建接收端

public static void main(String[] args) throws IOException {
        // 创建接收端
        DatagramSocket data = new DatagramSocket(6666);

        byte[] bytes = new byte[1024 * 24];
        // 创建数据包
        DatagramPacket pack = new DatagramPacket(bytes,bytes.length);
        while (true){
            // 接收数据
            data.receive(pack);
            // 获取数据发送的长度
            int len = pack.getLength();
            // 数据转换成字符串打印
            String s = new String(bytes, 0, len);
            System.out.println(s);
            // 打印发送者ip
            System.out.println(pack.getSocketAddress());
            // 打印发送者端口号
            System.out.println(pack.getPort());
        }
    }

UDP广播发送接收

只需要把发送的 ip 换成如下 OK

InetAddress.getByName("255.255.255.255")

创建发送端

public static void main(String[] args) throws IOException {
    // 创建发送端
    DatagramSocket data = new DatagramSocket();
    Scanner sc = new Scanner(System.in);

    while (true) {
        System.out.println("请说:");
        String s = sc.nextLine();
        if (s.equals("exit")) {
            data.close();
            break;
        }
        // 写入数据
        byte[] bytes = s.getBytes();
        // 创建数据包
        DatagramPacket pack = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("255.255.255.255"), 6666);
        data.send(pack);
    }

创建接收端

public static void main(String[] args) throws IOException {
    // 创建接收端
    DatagramSocket data = new DatagramSocket(6666);

    byte[] bytes = new byte[1024 * 24];
    // 创建数据包
    DatagramPacket pack = new DatagramPacket(bytes,bytes.length);
    while (true){
        // 接收数据
        data.receive(pack);
        // 获取数据发送的长度
        int len = pack.getLength();
        // 数据转换成字符串打印
        String s = new String(bytes, 0, len);
        System.out.println(s);
        // 打印发送者ip
        System.out.println(pack.getSocketAddress());
        // 打印发送者端口号
        System.out.println(pack.getPort());
    }
}

UDP 组播发送接收

接收端的改变

要使用MulticastSocket,但是技术在 java14 就过时了。

// 创建接收端
MulticastSocket data = new MulticastSocket(6666);
data.joinGroup(InetAddress.getByName("224.0.3.6"));

使用新版。不适用 java 1.8

// 创建接收端
MulticastSocket data = new MulticastSocket(6666);
data.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.3.6"),6666),
        NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));

发送端

public static void main(String[] args) throws IOException {
    // 创建发送端
    DatagramSocket data = new DatagramSocket();
    Scanner sc = new Scanner(System.in);

    while (true) {
        System.out.println("请说:");
        String s = sc.nextLine();
        if (s.equals("exit")) {
            data.close();
            break;
        }
        // 写入数据
        byte[] bytes = s.getBytes();
        // 创建数据包  组播地址,在224之间
        DatagramPacket pack = new DatagramPacket(bytes, bytes.length,
                InetAddress.getByName("224.0.0.1"), 9999);
        data.send(pack);
    }
}

接收端

public static void main(String[] args) throws IOException {
    // 创建接收端
    MulticastSocket data = new MulticastSocket(9999);
    data.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.0.1"), 9999),
            NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));

    byte[] bytes = new byte[1024 * 64];
    // 创建数据包
    DatagramPacket pack = new DatagramPacket(bytes, bytes.length);
    while (true) {
        // 接收数据
        data.receive(pack);
        // 获取数据发送的长度
        int len = pack.getLength();
        // 数据转换成字符串打印
        String s = new String(bytes, 0, len);
        System.out.println(s);
        // 打印发送者ip
        System.out.println(pack.getSocketAddress());
        // 打印发送者端口号
        System.out.println(pack.getPort());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值