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

📄 basemessage.java

📁 JAVA解析MSNP15协议
💻 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 + -