⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packetsender.java

📁 java B++树 一个很好的算法来实现这些问题 推荐!
💻 JAVA
字号:
package mddb.client;

import java.net.*;
import java.io.*;
import mddb.packets.MddbPacket;
import java.util.*;
import java.awt.Point;

public class PacketSender {
    public PacketSender() {
    }

    private ParentNode srcNode; //保存到节点的引用
    private MulticastSocket mulSocket;
    public PacketSender( ParentNode node ) {
        srcNode = node;
    }

    //发送分组数据包,发送失败抛出IOException--frameType为桢的类型(在MddbPacket中定义)
    public void sendNetPacket( MddbPacket mp,int frameType) throws IOException {
        mulSocket = new MulticastSocket();
        byte[] dummy = new byte[0]; //dummy没用,只是用来给构造函数充数而已
        InetAddress group = InetAddress.getByName( "231.0.0.1" );
        DatagramPacket dgp = new DatagramPacket( dummy, 0, group, 9999 );
        //解析数据---将所有数据进行打包
        StringBuffer sb = new StringBuffer();
        addHeader(mp,frameType,sb);
        addData(mp,frameType,sb);
        //发送数据
        byte[] data = sb.toString().getBytes();
        dgp.setData( data );
        dgp.setLength( data.length );
        mulSocket.send( dgp );
        //关闭Socket
        mulSocket.close();
    }

    //sender中的私有辅助函数=================================================
    //为最后结果添加包头,其中result参数为最后的桢数据,个属性之间用@隔开,并以EndOfHeader结束
    private void addHeader(MddbPacket mp,int frameType,StringBuffer result)
    {
        //1.写入桢的类型
        result.append(frameType+"@");
        //2.位置信息用X:Y的形式写入--源节点位置
        result.append((int)(mp.getSrcAddr().getX())+":"+
                      (int)(mp.getSrcAddr().getY())+"@");
        //3.源节点ID
        result.append(mp.getSrcId()+"@");
        //4.目的节点位置
        result.append((int)(mp.getDestAddr().getX())+":"+
                      (int)(mp.getDestAddr().getY())+"@");
        //5.路径长度
        result.append(mp.getPathLength()+"@");
        //6.写入包路由表--用字符串“EndOfList”结束
        for(int i = 0; i < mp.getRoutineList().size(); i++)
        {
            result.append( (int)(((Point)mp.getRoutineList().get(i)).getX())+":"+
                           (int)(((Point)mp.getRoutineList().get(i)).getY())+"@");
        }
        result.append("EndOfList@");
        result.append(mp.getType()+"@");
        result.append(mp.getTimeStamp()+"@");
        result.append("EndOfHeader@");
    }
    //7.为桢添加数据部分--以EndOfData作结
    private void addData(MddbPacket mp,int frameType,StringBuffer result)
    {
        if(frameType == MddbPacket.FRAME_GROUP_PKG)
        {
            if(mp.getType()==MddbPacket.NET_RM    ||
               mp.getType()==MddbPacket.NET_RRM   ||
               mp.getType()==MddbPacket.NET_DELAY)
                result.append("@EndOfData");
            else{
                result.append( mp.getData() );
                result.append( "@EndOfData" );
            }
        }else if(frameType == MddbPacket.FRAME_ROUTINE_PKG)
        {
            //TODO:对路由包的处理
        }else{
            //TODO:对查询包的处理
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -