📄 basemessage.java
字号:
package jm.framework.msn.msg;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jm.framework.msn.entity.TransactionId;
import jm.framework.msn.util.MessageI;
import jm.framework.msn.util.StringUtil;
import jm.jmmnet.sf.jml.util.NumberUtils;
import net.sf.cindy.util.ByteBufferUtils;
/**
* 数据信息包
* 梦界家园MSNP15
* @author ISHome
* @since 0.5.0.1
* @version 0.1
*/
public class BaseMessage implements MessageI {
/** 数据头 */
protected String headerCommand;
/** 队列号码 */
protected int trId = -1;
/** 信息队列 */
protected final List<String> params = new ArrayList<String>();
/** 大数据信息 */
protected byte[] chunkData;
public BaseMessage() {
this.headerCommand = "JMMP";
}
/**
* 初期操作
*/
public void init() {
}
/**
* 获得当前信息队列号码
* @return
*/
public final int getTransactionId() {
return trId;
}
/**
* 获得头部命令
* @return
*/
public final String getHeaderCommand() {
return headerCommand;
}
/**
* 是否需要队列号码
* @return
*/
public boolean isSupportTransactionId() {
return true;
}
public final void setTransactionId(int trId) {
if (isSupportTransactionId())
this.trId = trId;
}
/**
* 自动获得新的队列编号
*/
public final void setNewTransactionId() {
if (isSupportTransactionId()) {
TransactionId transactionId = TransactionId.getInstance();
this.trId = transactionId.nextTransactionId();
}
}
/**
* 设置头部命令
* @param command
*/
public final void setHeaderCommand(String command) {
this.headerCommand = command;
}
/**
* 返回数据包中索引信息
* @param index
* @return
*/
public final String get(int index) {
if (index < params.size()) {
return params.get(index);
}
return null;
}
/**
* 获得数据包信息数目
* @return
*/
public final int getParamCount() {
return params.size();
}
/**
* 设置数据包信息内容
* @param index
* @param s
*/
public final void set(int index, String s) {
for (int i = params.size() - index - 1; i < 0; i++) {
params.add("");
}
params.set(index, s);
}
/**
* 设置数据包信息内容
* @param s
*/
public final void add(String s) {
if (s != null) {
params.add(s);
}
}
/**
* 清除数据包信息内容
*/
public final List<String> getParams() {
return params;
}
/**
* 清除数据包信息内容
*/
public final void clearParams() {
params.clear();
}
/**
* 是否支持大数据信息
* @return
*/
public boolean isSupportChunkData() {
return false;
}
/**
* 获得大数据信息
* @return
*/
public final byte[] getChunkData() {
return chunkData;
}
/**
* 设置大数据信息
* @param chunkData
*/
public final void setChunkData(byte[] chunkData) {
if (isSupportChunkData())
this.chunkData = chunkData;
}
// /**
// * 设置大数据信息
// * @param chunkData
// */
// public final void setChunkData(String chunkData) {
// this.chunkData = Charset.encodeAsByteArray(chunkData);
// }
public static final Pattern noChunkPattern = Pattern.compile("(\\S{3})(.*)");
public static final Pattern chunkPattern = Pattern.compile("(\\S{3})(.*) (\\d+)");
public static final ByteBuffer split = StringUtil.CHATSET_UTF8.encode(StringUtil.LINE_SEPARATOR);
/**
* 内部重新构造
* @param buffer
* @return
*/
public boolean load(ByteBuffer buffer) {
int index = ByteBufferUtils.indexOf(buffer, split);
if (index < 0)
return false;
String s = StringUtil.CHATSET_UTF8.decode((ByteBuffer) buffer.slice().limit(index - buffer.position())).toString();
Matcher matcher;
if (isSupportChunkData())
matcher = chunkPattern.matcher(s);
else
matcher = noChunkPattern.matcher(s);
if (!matcher.matches()) //Not match
return false;
if (isSupportChunkData()) { //Check chunk data is completed
int chunkLen = NumberUtils.stringToInt(matcher.group(3));
if (buffer.limit() < index + split.remaining() + chunkLen)
return false;
buffer.position(index + split.remaining());
chunkData = new byte[chunkLen];
buffer.get(chunkData);
} else {
buffer.position(index + split.remaining());
}
setHeaderCommand(matcher.group(1));
String params = matcher.group(2);
if (params != null) {
clearParams();
StringTokenizer st = new StringTokenizer(params);
if (isSupportTransactionId() && st.hasMoreTokens()) {
String token = st.nextToken();
if (NumberUtils.isDigits(token)) {
setTransactionId(NumberUtils.stringToInt(token));
} else {
add(token);
}
}
while (st.hasMoreTokens()) {
add(st.nextToken());
}
}
return true;
}
/**
* 转换成数据包
* @return
*/
protected String bodyToString() {
StringBuffer buffer = new StringBuffer();
buffer.append(headerCommand);
if (trId >= 0) {
buffer.append(" ").append(trId);
}
for (String param : params) {
buffer.append(" ").append(param);
}
if (chunkData != null) {
buffer.append(" ").append(chunkData.length);
}
buffer.append(StringUtil.LINE_SEPARATOR);
return buffer.toString();
}
/**
* 转换成字节数组
* @return
*/
public ByteBuffer[] toByteBuffers() {
ByteBuffer[] result = new ByteBuffer[chunkData == null ? 1 : 2];
try {
result[0] = StringUtil.encode(bodyToString());
if (chunkData != null)
result[1] = ByteBuffer.wrap(chunkData);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(bodyToString());
if (chunkData != null) {
//buffer.append(StringUtil.CHATSET_UTF8.decode(chunkData));
}
return buffer.toString();
}
///////////////////////////////////////////////////////////////////
// /**
// * 读取数据
// *
// * @return
// * @throws IOException
// */
// public void writeData(OutputStream out) {
// try {
// System.out.println(">>> "+toString());
// out.write((toString() + "\r\n").getBytes("UTF-8"));
// out.flush();
// } catch (Exception e) {
// }
// }
//
// /**
// * 读取数据
// *
// * @return
// * @throws IOException
// */
// public void readData(InputStream input) {
// String msg = "JMMP";
// try {
// ByteArrayOutputStream inbuf = new ByteArrayOutputStream();
// inbuf.reset();
// while (true) {
// int v = input.read();
// if (v == -1)
// return;
// if (v == 13)
// continue;
// if (v == 10)
// break;
// inbuf.write(v);
// }
// msg = new String(inbuf.toByteArray(), "UTF-8") + "";
// } catch (Exception e) {
// e.printStackTrace();
// }
// System.out.println("<<< "+msg);
// }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -