package server;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.mina.core.session.IoSession;
import protocol.ProtoHead;
import tools.DataTypeTranslater;
/**
* 存放网络通信每一个请求的对象(将放入队列)
*
* @author Feng
*/
public class NetworkPacket {
// 信息中的int所占的字节数
public static final int HEAD_INT_SIZE = 4;
// 信息中的floats所占的字节数
public static final int HEAD_FLOAT_SIZE = 4;
public IoSession ioSession;
public byte[] arrayBytes;
public NetworkPacket(IoSession ioSession, byte[] arrayBytes) {
this.ioSession = ioSession;
this.arrayBytes = arrayBytes;
}
/**
* 获取请求的长度
*
* @return int
* @author Feng
*/
public int getMessageLength() {
// return arrayBytes.length;
return getMessageLength(arrayBytes);
}
public static int getMessageLength(byte[] array) {
return array.length;
// return DataTypeTranslater.bytesToInt(array, getSizeStartIndex());
}
/**
* 获取请求类型
*
* @return ProtoHead.ENetworkMessage
* @author Feng
*/
public ProtoHead.ENetworkMessage getMessageType() {
return getMessageType(arrayBytes);
}
public static ProtoHead.ENetworkMessage getMessageType(byte[] array) {
return ProtoHead.ENetworkMessage.valueOf(DataTypeTranslater.bytesToInt(array, HEAD_INT_SIZE));
}
/**
* 获取MessageId
*
* @return byte[]
* @author Feng
*/
public byte[] getMessageID() {
return getMessageID(arrayBytes);
}
public static byte[] getMessageID(byte[] array) {
int offset = getMessageIdStartIndex();
byte[] messageIdBytes = new byte[HEAD_FLOAT_SIZE];
for (int i = 0; i < messageIdBytes.length; i++)
messageIdBytes[i] = array[offset + i];
return messageIdBytes;
}
/**
* 获取消息的对象byte数组
*
* @return byte[]
* @author Feng
*/
public byte[] getMessageObjectBytes() {
return getMessageObjectBytes(arrayBytes);
}
public static byte[] getMessageObjectBytes(byte[] array) {
// System.out.println(getMessageLength(array) -
// getMessageObjectStartIndex());
byte[] response = new byte[getMessageLength(array) - getMessageObjectStartIndex()];
for (int i = 0; i < response.length; i++)
response[i] = array[getMessageObjectStartIndex() + i];
return response;
}
/**
* 打包成可以发送的byte[]
*
* @param messageType
* @param packetBytes
* @return byte[]
* @throws IOException
* @author Feng
*/
public static byte[] packMessage(int messageType, byte[] packetBytes) throws IOException {
return packMessage(messageType, ServerModel.createMessageId(), packetBytes);
}
public static byte[] packMessage(int messageType, byte[] messageIdBytes, byte[] packetBytes) throws IOException {
int size = getMessageObjectStartIndex() + packetBytes.length;
byte[] messageBytes = new byte[size];
// 1.添加size
byte[] sizeBytes = DataTypeTranslater.intToByte(size);
for (int i = 0; i < sizeBytes.length; i++)
messageBytes[i] = sizeBytes[i];
// 2.加入类型
byte[] typeBytes = DataTypeTranslater.intToByte(messageType);
for (int i = 0; i < typeBytes.length; i++)
messageBytes[getTypeStartIndex() + i] = typeBytes[i];
// 3.添加MessageId
for (int i = 0; i < messageIdBytes.length; i++)
messageBytes[getMessageIdStartIndex() + i] = messageIdBytes[i];
// 4.加入数据包
for (int i = 0; i < packetBytes.length; i++)
messageBytes[getMessageObjectStartIndex() + i] = packetBytes[i];
return messageBytes;
}
// 各个数据的开始位
public static int getSizeStartIndex() {
return 0;
}
public static int getTypeStartIndex() {
return getSizeStartIndex() + HEAD_INT_SIZE;
}
public static int getMessageIdStartIndex() {
return getTypeStartIndex() + HEAD_INT_SIZE;
}
public static int getMessageObjectStartIndex() {
return getMessageIdStartIndex() + HEAD_FLOAT_SIZE;
}
public static void showPacket(Logger logger, IoSession ioSession, byte[] byteArray) {
try {
logger.debug("Server send packet to client(" + ServerModel.getIoSessionKey(ioSession) + "); MessageType : "
+ NetworkPacket.getMessageType(byteArray).toString() + "; MessageId : "
+ NetworkPacket.getMessageID(byteArray));
} catch (Exception e) {
e.printStackTrace();
}
}
}