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

相关推荐
看浪的路人7 分钟前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
临床数据科学和人工智能兴趣组18 分钟前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
大侠归来18 分钟前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
蜗牛互联网18 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
SEO_juper35 分钟前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
Wang's Blog39 分钟前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
Wang's Blog41 分钟前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
今年下半年1 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
盛世宏博北京1 小时前
十二防档案库房总线架构设计:恒湿消毒净化一体机 RS485 组网实战笔记
开发语言·笔记·php·恒湿机·档案八防温湿度
wespaul1 小时前
VeapAI 自然语言操作实战|第 04 篇:系统数据加工——把系统自身的元数据吃成知识
java·大数据·运维·数据库·人工智能