• 17.4.3 使用MulticastSocket实现多点广播(2)


    • // 让该类实现Runnable接口,该类的实例可作为线程的target 
    • public class MulticastSocketTest implements Runnable 
    •     // 使用常量作为本程序的多点广播IP地址 
    •     private static final String BROADCAST_IP
    •         = "230.0.0.1"; 
    •     // 使用常量作为本程序的多点广播目的地端口 
    •     public static final int BROADCAST_PORT = 30000; 
    •     // 定义每个数据报的最大大小为4KB 
    •     private static final int DATA_LEN = 4096; 
    •     // 定义本程序的MulticastSocket实例 
    •     private MulticastSocket socket = null; 
    •     private InetAddress broadcastAddress = null; 
    •     private Scanner scan = null; 
    •     // 定义接收网络数据的字节数组 
    •     byte[] inBuff = new byte[DATA_LEN]; 
    •     // 以指定字节数组创建准备接收数据的DatagramPacket对象 
    •     private DatagramPacket inPacket
    •         = new DatagramPacket(inBuff , inBuff.length); 
    •     // 定义一个用于发送的DatagramPacket对象 
    •     private DatagramPacket outPacket = null; 
    •     public void init()throws IOException 
    •     { 
    •         try( 
    •             // 创建键盘输入流 
    •             Scanner scan = new Scanner(System.in)) 
    •         { 
    •             // 创建用于发送、接收数据的MulticastSocket对象 
    •             // 由于该MulticastSocket对象需要接收数据,所以有指定端口 
    •             socket = new MulticastSocket(BROADCAST_PORT); 
    •             broadcastAddress = InetAddress.getByName(BROADCAST_IP); 
    •             // 将该socket加入指定的多点广播地址 
    •             socket.joinGroup(broadcastAddress); 
    •             // 设置本MulticastSocket发送的数据报会被回送到自身 
    •             socket.setLoopbackMode(false); 
    •             // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 
    •             outPacket = new DatagramPacket(new byte[0]  
    •                 , 0 , broadcastAddress , BROADCAST_PORT); 
    •             // 启动以本实例的run()方法作为线程执行体的线程 
    •             new Thread(this).start(); 
    •             // 不断地读取键盘输入 
    •             while(scan.hasNextLine()) 
    •             { 
    •                 // 将键盘输入的一行字符串转换成字节数组 
    •                 byte[] buff = scan.nextLine().getBytes(); 
    •                 // 设置发送用的DatagramPacket里的字节数据 
    •                 outPacket.setData(buff); 
    •                 // 发送数据报 
    •                 socket.send(outPacket); 
    •             } 
    •         } 
    •         finally 
    •         { 
    •             socket.close(); 
    •         } 
    •     } 
    •     public void run() 
    •     { 
    •         try 
    •         { 
    •             while(true) 
    •             { 
    •                 // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里 
    •                 socket.receive(inPacket); 
    •                 // 打印输出从socket中读取的内容 
    •                 System.out.println("聊天信息:" + new String(inBuff  
    •                     , 0 , inPacket.getLength())); 
    •             } 
    •         } 
    •         // 捕获异常 
    •         catch (IOException ex) 
    •         { 
    •             ex.printStackTrace(); 
    •             try 
    •             { 
    •                 if (socket != null) 
    •                 { 
    •                     // 让该Socket离开该多点IP广播地址 
    •                     socket.leaveGroup(broadcastAddress); 
    •                     // 关闭该Socket对象 
    •                     socket.close(); 
    •                 } 
    •                 System.exit(1);  
    •             } 
    •             catch (IOException e) 
    •             { 
    •                 e.printStackTrace(); 
    •             } 
    •         } 
    •     } 
    •     public static void main(String[] args)  
    •         throws IOException 
    •     { 
    •         new MulticastSocketTest().init(); 
    •     } 
  • 相关阅读:
    Bonding
    负载均衡
    XML
    wireshark
    IE
    轨迹系列7——Socket总结及实现基于TCP或UDP的809协议方法
    轨迹系列6——车载GPS对接方案汇总小结(809、自定义协议、前置库、WS)
    基于R树索引的点面关系判断以及效率优化统计
    WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法
    轨迹系列5——验证轨迹GPS坐标转换为本地坐标的四/七参数是否准确的一种方案
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/4966956.html
Copyright © 2020-2023  润新知