当前位置: 首页>>代码示例>>Java>>正文


Java IoBuffer.clear方法代码示例

本文整理汇总了Java中org.apache.mina.core.buffer.IoBuffer.clear方法的典型用法代码示例。如果您正苦于以下问题:Java IoBuffer.clear方法的具体用法?Java IoBuffer.clear怎么用?Java IoBuffer.clear使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在org.apache.mina.core.buffer.IoBuffer的用法示例。


在下文中一共展示了IoBuffer.clear方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。

示例1: internalFlush

import org.apache.mina.core.buffer.IoBuffer; //导入方法依赖的package包/类
/**
 * Internal method that actually flushes the buffered data.
 * 
 * @param nextFilter the {@link NextFilter} of this filter
 * @param session the session where buffer will be written
 * @param buf the data to write
 * @throws Exception if a write operation fails
 */
private void internalFlush(NextFilter nextFilter, IoSession session, IoBuffer buf) throws Exception {
    IoBuffer tmp = null;
    synchronized (buf) {
        buf.flip();
        tmp = buf.duplicate();
        buf.clear();
    }
    logger.debug("Flushing buffer: {}", tmp);
    nextFilter.filterWrite(session, new DefaultWriteRequest(tmp));
}
 
开发者ID:eclipse,项目名称:neoscada,代码行数:19,代码来源:BufferedWriteFilter.java

示例2: decode

import org.apache.mina.core.buffer.IoBuffer; //导入方法依赖的package包/类
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
	//必须保证每一个数据包的字节缓存都和session绑定在一起,不然就读取不了上一次剩余的数据了
	CodecContext context = SessionManager.INSTANCE.getSessionAttr(session, SessionProperties.CODEC_CONTEXT, CodecContext.class);
	if (context == null) {
		context = new CodecContext();
		session.setAttribute(SessionProperties.CODEC_CONTEXT, context);
	}

	IoBuffer ioBuffer = context.getBuffer();
	ioBuffer.put(in);

	//在循环里迭代,以处理数据粘包
	for (; ;) {
		ioBuffer.flip();
		//消息元信息常量4表示消息body前面的两个short字段,一个表示moduel,一个表示cmd,
		final int METE_SIZE = 4;
		if (ioBuffer.remaining() < METE_SIZE) {
			ioBuffer.compact();
			return;
		}
		//----------------消息协议格式-------------------------
		// packetLength | moduleId | cmd   |  body
		//       int       short     short    byte[]
		int length = ioBuffer.getInt();
		//int packLen = length + 4;
		//大于消息body长度,说明至少有一条完整的message消息
		if (ioBuffer.remaining() >= length) {
			short moduleId =  ioBuffer.getShort();
			short cmd = ioBuffer.getShort();
			byte[] body = new byte[length-METE_SIZE];
			ioBuffer.get(body);
			Message msg = readMessage(moduleId, cmd, body);

			if (moduleId > 0) {
				out.write(msg);
			} else { //属于组合包
				CombineMessage combineMessage = (CombineMessage)msg;
				List<Packet> packets = combineMessage.getPackets();
				for (Packet packet :packets) {
					//依次拆包反序列化为具体的Message
					out.write(Packet.asMessage(packet));
				}
			}
			if (ioBuffer.remaining() == 0) {
				ioBuffer.clear();
				break;
			}
			ioBuffer.compact();
		} else{
			//数据包不完整,继续等待数据到达
			ioBuffer.rewind();
			ioBuffer.compact();
			break;
		}
	}
}
 
开发者ID:kingston-csj,项目名称:jforgame,代码行数:57,代码来源:MessageDecoder.java

示例3: decodeAuto

import org.apache.mina.core.buffer.IoBuffer; //导入方法依赖的package包/类
/**
 * Decode a line using the default delimiter on the current system
 */
private void decodeAuto(Context ctx, IoSession session, IoBuffer in, ProtocolDecoderOutput out)
        throws CharacterCodingException, ProtocolDecoderException {
    int matchCount = ctx.getMatchCount();

    // Try to find a match
    int oldPos = in.position();
    int oldLimit = in.limit();

    while (in.hasRemaining()) {
        byte b = in.get();
        boolean matched = false;

        switch (b) {
        case '\r':
            // Might be Mac, but we don't auto-detect Mac EOL
            // to avoid confusion.
            matchCount++;
            break;

        case '\n':
            // UNIX
            matchCount++;
            matched = true;
            break;

        default:
            matchCount = 0;
        }

        if (matched) {
            // Found a match.
            int pos = in.position();
            in.limit(pos);
            in.position(oldPos);

            ctx.append(in);

            in.limit(oldLimit);
            in.position(pos);

            if (ctx.getOverflowPosition() == 0) {
                IoBuffer buf = ctx.getBuffer();
                buf.flip();
                buf.limit(buf.limit() - matchCount);

                try {
                    byte[] data = new byte[buf.limit()];
                    buf.get(data);
                    CharsetDecoder decoder = ctx.getDecoder();

                    CharBuffer buffer = decoder.decode(ByteBuffer.wrap(data));
                    String str = new String(buffer.array());
                    writeText(session, str, out);
                } finally {
                    buf.clear();
                }
            } else {
                int overflowPosition = ctx.getOverflowPosition();
                ctx.reset();
                throw new RecoverableProtocolDecoderException("Line is too long: " + overflowPosition);
            }

            oldPos = pos;
            matchCount = 0;
        }
    }

    // Put remainder to buf.
    in.position(oldPos);
    ctx.append(in);

    ctx.setMatchCount(matchCount);
}
 
开发者ID:eclipse,项目名称:neoscada,代码行数:77,代码来源:TextLineDecoder.java

示例4: decodeNormal

import org.apache.mina.core.buffer.IoBuffer; //导入方法依赖的package包/类
/**
 * Decode a line using the delimiter defined by the caller
 */
private void decodeNormal(Context ctx, IoSession session, IoBuffer in, ProtocolDecoderOutput out)
        throws CharacterCodingException, ProtocolDecoderException {
    int matchCount = ctx.getMatchCount();

    // Try to find a match
    int oldPos = in.position();
    int oldLimit = in.limit();

    while (in.hasRemaining()) {
        byte b = in.get();

        if (delimBuf.get(matchCount) == b) {
            matchCount++;

            if (matchCount == delimBuf.limit()) {
                // Found a match.
                int pos = in.position();
                in.limit(pos);
                in.position(oldPos);

                ctx.append(in);

                in.limit(oldLimit);
                in.position(pos);

                if (ctx.getOverflowPosition() == 0) {
                    IoBuffer buf = ctx.getBuffer();
                    buf.flip();
                    buf.limit(buf.limit() - matchCount);

                    try {
                        writeText(session, buf.getString(ctx.getDecoder()), out);
                    } finally {
                        buf.clear();
                    }
                } else {
                    int overflowPosition = ctx.getOverflowPosition();
                    ctx.reset();
                    throw new RecoverableProtocolDecoderException("Line is too long: " + overflowPosition);
                }

                oldPos = pos;
                matchCount = 0;
            }
        } else {
            // fix for DIRMINA-506 & DIRMINA-536
            in.position(Math.max(0, in.position() - matchCount));
            matchCount = 0;
        }
    }

    // Put remainder to buf.
    in.position(oldPos);
    ctx.append(in);

    ctx.setMatchCount(matchCount);
}
 
开发者ID:eclipse,项目名称:neoscada,代码行数:61,代码来源:TextLineDecoder.java

示例5: decode

import org.apache.mina.core.buffer.IoBuffer; //导入方法依赖的package包/类
@Override
public void decode ( final IoSession session, final IoBuffer in, final ProtocolDecoderOutput out ) throws Exception
{
    in.clear ();
}
 
开发者ID:eclipse,项目名称:neoscada,代码行数:6,代码来源:NullProtocolDecoder.java


注:本文中的org.apache.mina.core.buffer.IoBuffer.clear方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。