package server;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import exception.NoIpException;
import tools.DataTypeTranslater;
/**
* 向客户端发数据时的组成模式
*
* @author Feng
*
*/
public class MinaEncoder extends ProtocolEncoderAdapter {
Logger logger = Logger.getLogger(this.getClass());
private ByteArrayOutputStream byteArrayOutputStream;
private PacketFromServer packetWillSend;
@Override
public void encode(IoSession ioSession, Object message, ProtocolEncoderOutput output) throws Exception {
// String msg = (String) message;
// byte[] bytes = msg.getBytes("UTF-8");
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] byteArray;
if (message.getClass().equals(PacketFromServer.class)) {
packetWillSend = (PacketFromServer) message;
// 1.加入类型
byteArrayOutputStream.write(packetWillSend.getMessageTypeBytes());
// 2.添加MessageId
byteArrayOutputStream.write(packetWillSend.getMessageID());
// 3.加入数据包
byteArrayOutputStream.write(packetWillSend.getMessageBoty());
int sizeOfAll = byteArrayOutputStream.size() + DataTypeTranslater.INT_SIZE;
byteArray = byteArrayOutputStream.toByteArray();
IoBuffer buffer = IoBuffer.allocate(sizeOfAll);
buffer.put(DataTypeTranslater.intToByte(sizeOfAll)); // header
buffer.put(byteArray); // body
buffer.flip();
output.write(buffer);
// showPacket(ioSession, sizeOfAll, byteArray);
return;
}
byte[] bytes = (byte[]) message;
int length = bytes.length;
// System.out.println("MinaEncoder : " + length);
byte[] header = DataTypeTranslater.intToByte(length); // 按小字节序转成字节数组
IoBuffer buffer = IoBuffer.allocate(length + DataTypeTranslater.INT_SIZE);
buffer.put(header); // header
buffer.put(bytes); // body
buffer.flip();
output.write(buffer);
}
private ByteArrayOutputStream byteArrayOutputStream2;
private void showPacket(IoSession ioSession, int size, byte[] byteArray) {
byteArrayOutputStream2 = new ByteArrayOutputStream();
try {
byteArrayOutputStream2.write(DataTypeTranslater.intToByte(size));
byteArrayOutputStream2.write(byteArray);
byte[] newByteArray = byteArrayOutputStream2.toByteArray();
try {
logger.info("111111111111111111111111111111111111111111111111");
logger.info("Server send Message to Client(" + ServerModel.getIoSessionKey(ioSession).toString() + ") ,Type : "
+ NetworkPacket.getMessageType(newByteArray) + " MessageId : "
+ DataTypeTranslater.bytesToInt(NetworkPacket.getMessageID(newByteArray), 0));
} catch (NoIpException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
NetworkPacket.showPacket(logger, ioSession, byteArrayOutputStream2.toByteArray());
}
}