📄 packetsender.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 + -