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

相关推荐
Themberfue几秒前
基础算法之双指针--Java实现(下)--LeetCode题解:有效三角形的个数-查找总价格为目标值的两个商品-三数之和-四数之和
java·开发语言·学习·算法·leetcode·双指针
深山夕照深秋雨mo9 分钟前
在Java中操作Redis
java·开发语言·redis
努力的布布15 分钟前
SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
java·后端·spring
xujinwei_gingko15 分钟前
Spring MVC 常用注解
java·spring·mvc
PacosonSWJTU20 分钟前
spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
java·后端·springmvc
PacosonSWJTU22 分钟前
spring揭秘26-springmvc06-springmvc注解驱动的web应用
java·spring·springmvc
barbyQAQ27 分钟前
Qt源码阅读——事件循环
开发语言·数据库·qt
记得开心一点嘛29 分钟前
在Java项目中如何使用Scala实现尾递归优化来解决爆栈问题
开发语言·后端·scala
敏编程44 分钟前
网页前端开发之Javascript入门篇(5/9):函数
开发语言·javascript
柏箱1 小时前
PHP基本语法总结
开发语言·前端·html·php