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

相关推荐
深色風信子几秒前
Kotlin Bytedeco OpenCV 图像图像58 无缝克隆
开发语言·opencv·kotlin·bytedeco
朝阳3912 分钟前
react19【系列实用教程】实用组件封装
开发语言·前端·javascript
我是苏苏19 分钟前
C#基础:使用System.Speech.Synthesis离线播放/朗读文字内容
开发语言·c#
Patrick在香港33 分钟前
Python依赖管理从踩坑到选型:pip/poetry/uv四种方案全面实测
开发语言·python·数据分析·scikit-learn·ai编程·pip·uv
骇客野人34 分钟前
IntelliJ IDEA 菜单中英对照
java·ide·intellij-idea
我命由我1234534 分钟前
Kotlin 面向对象 - 枚举排序
android·java·开发语言·java-ee·kotlin·android studio·android-studio
程序喵大人37 分钟前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl
Sam_Deep_Thinking1 小时前
用Java 17从0到1写一个mini版RPC,理解远程调用的本质
java·面试·rpc·程序员·系统架构
luj_17681 小时前
随机性在算法与占卜中的共通原理
c语言·开发语言·c++·经验分享·算法
Lazionr1 小时前
vector初识——从动态数组到STL核心容器
开发语言·c++