`
sdh88hf
  • 浏览: 67983 次
  • 性别: Icon_minigender_1
  • 来自: 绍兴
社区版块
存档分类
最新评论

spring 整合mina

阅读更多
首先定义自定义过滤器
<bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
		<constructor-arg>
<!--编码过滤器-->
			<bean class="com.kcb.common.socket.kaicom.KaiComCodecFactory"></bean>
		</constructor-arg>
	</bean>

	<bean id="filterChainBuilder"
		class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
		<property name="filters">
			<map>

			<entry key="codecFilter" value-ref="codecFilter" />
				
			</map>
		</property>
	</bean>


KaiComCodecFactory.java
public class KaiComCodecFactory  implements ProtocolCodecFactory{
	private final KaiComDecoder decoder;
	private final KaiComEncoder encoder;
	@Override
	public ProtocolEncoder getEncoder(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		return encoder;
	}

	@Override
	public ProtocolDecoder getDecoder(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		return decoder;
	}

    public KaiComCodecFactory() {
        decoder = new KaiComDecoder();
        encoder = new KaiComEncoder();
    }
}


KaiComDecoder.jar
public class KaiComDecoder implements ProtocolDecoder {
	 private final Charset charset;
	 private int bufferLength = 128;
		 public KaiComDecoder(Charset charset) {
		        if (charset == null) {
		            throw new IllegalArgumentException("charset parameter shuld not be null");
		        }


		        this.charset = charset;

		        // Convert delimiter to ByteBuffer if not done yet.
		    }
		 public KaiComDecoder() {

		        this.charset = Charset.forName("UTF-8");

		        // Convert delimiter to ByteBuffer if not done yet.
		    }
	 
	@Override
	public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
			throws Exception {
		String str = ioBufferToString(in);
		if(str != null){
			String[] list = str.split("\\|");
			if(list.length>1){//判断自定义协议
				if(list[1].compareToIgnoreCase("98") == 0||list[1].compareToIgnoreCase("01") == 0){
					 writeText(session, str, out);
					 return;
				}
			}
		}
	}
	
	
	public static String ioBufferToString(Object message)   
	{   
	      if (!(message instanceof IoBuffer))   
	      {   
	        return "";   
	      }   
	      IoBuffer ioBuffer = (IoBuffer) message;   
	      byte[] b = new byte [ioBuffer.limit()];   
	      ioBuffer.get(b);   
	      StringBuffer stringBuffer = new StringBuffer();   
	  
	      for (int i = 0; i < b.length; i++)   
	      {   
	  
	       stringBuffer.append((char) b [i]);   
	      }   
	       return stringBuffer.toString();   
	}  
	

	@Override
	public void finishDecode(IoSession session, ProtocolDecoderOutput out)
			throws Exception {
		// TODO Auto-generated method stub
		InetSocketAddress isa = (InetSocketAddress) session.getRemoteAddress();
		System.out.println("客户端:" + isa.getAddress().getHostAddress() + ":"
				+ isa.getPort() + "连接关闭了!");
	}

	@Override
	public void dispose(IoSession session) throws Exception {
		// TODO Auto-generated method stub
	}
    protected void writeText(IoSession session, String text, ProtocolDecoderOutput out) {
        out.write(text);
    }


KaiComEncoder.java
public class KaiComEncoder extends ProtocolEncoderAdapter {

	@Override
	public void encode(IoSession session, Object message,
			ProtocolEncoderOutput out) throws Exception {
		// TODO Auto-generated method stub
	        out.write(stringToIoBuffer(message.toString()));
	}
	
	public static IoBuffer stringToIoBuffer(String str)   
	{   
	  
	       byte bt[] = str.getBytes();   
	  
	       IoBuffer ioBuffer = IoBuffer.allocate(bt.length);   
	       ioBuffer.put(bt, 0, bt.length);   
	       ioBuffer.flip();   
	       return ioBuffer;   
	}   

}


配置监听地址和端口
<!-- 指定服务端地址和端口 -->
	<bean id="address" class="java.net.InetSocketAddress">
		<constructor-arg index="0" value="125.118.54.228" />
		<constructor-arg index="1" value="6889}" />
	</bean>


配置监听事件
<!-- 这里是那个自定义的类 -->
	<bean id="someServer" class="com.kcb.common.socket.action.SomeServer"></bean>

	<!-- 自定义的serverHandler -->
	<bean id="serverHandler" class="com.kcb.common.socket.server.MinaServerHandler">
		<property name="someServer" ref="someServer"></property>
	</bean>

MinaServerHandler.java
public class MinaServerHandler extends IoHandlerAdapter {
	private SomeServer someServer;

	public void setSomeServer(SomeServer someServer) {
		this.someServer = someServer;
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause) {
		try {
			System.out.println("客户端 " + session.getRemoteAddress() + " 关闭了连接");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	/**
	 * 服务端接收消息
	 */
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		int result = someServer.doSome(message);
		String msg = message.toString();
		if ("quit".equals(msg)) {
			session.close(false);
			return;
		}
		// 对客户端做出的响应
		// 正常收到回复  OK_RECV
	    // 接收失败  OK_ERROR
		String response = "OK_RECV";
		if(result==-1){
			response = "OK_ERROR";
		}

		session.write(response);
	}

	/**
	 * 客户端连接的会话创建
	 */
	@Override
	public void sessionCreated(IoSession session) throws Exception {
		InetSocketAddress isa = (InetSocketAddress) session.getRemoteAddress();
		System.out.println("客户端:" + isa.getAddress().getHostAddress() + ":"
				+ isa.getPort() + "连接进来了。");
		//sessions.put(session.getRemoteAddress().toString(), session);
	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics