Java-1vN传输-控制台版

前言

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

此代码就是基于UDP协议编写。

通常把一对多的通信称为多播通信。采用多播通信技术,不仅可以实现一个发送者和多个接收者之间进行通信的功能,而且可以有效减轻网络通信的负担,避免资源的无谓浪费。

UDP组播地址:224.0.0.0 ~ 224.0.0.255

组播有一个特点,就是你发送地址可以使用一个端口,但是你接收地址也可以使用同样的一个端口。


数据发送

java 复制代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;

public class SendDataDemo {
    public static void main(String[] args) throws IOException {

        /* 组播 */
        Scanner in=new Scanner(System.in);
        MulticastSocket ms=new MulticastSocket();

        System.out.println("请输入用户名");
        String name=in.next()+":";

        new MyThread().start();
        while(true){
            String target=name+in.next();
            if("886".equals(target)) { break; }

            byte[] bytes = target.getBytes();
            InetAddress inetAddress = InetAddress.getByName("224.0.0.0");
            int port=11451;
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inetAddress,port);

            ms.send(dp);    // 发送
        }
        System.out.println("主线程退出");
        ms.close();
    }
}

数据接收线程

java 复制代码
import java.io.IOException;
import java.net.*;

public class MyThread extends Thread{
    @Override
    public void run() {
        MulticastSocket ms= null;  // 指定接收端口
        try {
            ms = new MulticastSocket(11451);
            InetAddress inetAddress = InetAddress.getByName("224.0.0.0");   // 指定组播地址
            ms.joinGroup(inetAddress);  // 将当前接收端加入组播
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
        while(true){
            try {
                ms.receive(dp); // 接收数据
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            int len = dp.getLength();       // 获取接收数据的长度
            byte[] data = dp.getData();     // 获取存储接收数据的数组
            String res = new String(data, 0, len);

            if("886".equals(res)) { break; }
            System.out.println(res);
        }
        System.out.println("输出线程退出");
    }
}

End

相关推荐
小冷coding1 分钟前
【Java】Dubbo 与 OpenFeign 的核心区别
java·开发语言·dubbo
Coder_Boy_5 分钟前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
2401_8948281218 分钟前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
玄同76519 分钟前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
羽翼.玫瑰20 分钟前
关于重装Python失败(本质是未彻底卸载Python)的问题解决方案综述
开发语言·python
cdut_suye20 分钟前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
CRMEB系统商城1 小时前
CRMEB多商户系统(PHP)- 移动端二开之基本容器组件使用
运维·开发语言·小程序·php
淮北4941 小时前
科研绘图工具R语言
开发语言·r语言
逍遥德1 小时前
java Map Set List 扩容机制
java·开发语言·list
高山上有一只小老虎1 小时前
mybatisplus实现分页查询
java·spring boot·mybatis