Java-1vN传输-控制台版

前言

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

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

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

UDP组播地址:224.0.0.0 ~ 224.0.0.255

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



数据发送

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();
    }
}



数据接收线程

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值