现在的位置: 首页 > 综合 > 正文

Mina通信框架学习初步

2012年06月19日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 评论关闭

1、Mina通信整体框架

2、Mina通信流程

3、Mina示例

3.1、客户端处理器

package com.boonya.mina.simple;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 客户端 IoHandler
 */

public class MyClinetIoHandler extends IoHandlerAdapter {

 private final static Logger logger = LoggerFactory.getLogger(MyClinetIoHandler.class);

 private final String values;

 public MyClinetIoHandler(String values) {
  this.values = values;
 }

 @Override
 public void sessionOpened(IoSession session) throws Exception {
  session.write(values);
  logger.debug("MyClinetIoHandler sessionOpened---------");
 }

}

package com.boonya.mina.simple;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
/**
 * mina框架中客户端与服务器端的执行流程一致,
 * 唯一的区别是: IoService的client实现是IoConnetor,server端是IoAcceptor
 */

public class MyClient {

	public static void main(String[] args) {
		// 1.创建ioservice
		IoConnector connector = new NioSocketConnector();
		connector.setConnectTimeoutMillis(30000);

		// 2.注册过滤器
		connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset
		    .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())));

		// 3注册iohandler,到ioserivce

		connector.setHandler(new MyClinetIoHandler("hello!\r\nworld!"));
		// 4.绑定套接字,建立连接
		connector.connect(new InetSocketAddress("localhost", 1000));

	}

}

3.2、客户端处理

package com.boonya.mina.simple;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * IoHandler处理客户端的数据
 */
public class MyServerIoHandler extends IoHandlerAdapter {

	private final static Logger logs = LoggerFactory.getLogger(MyServerIoHandler.class);

	public void messageReceived(IoSession session, Object message)	throws Exception {

		String str = message.toString();

		logs.info("the message received is[" + str + "]");

		System.out.println("the message received is[" + str + "]");

		if (str.endsWith("quit")){
			session.close(true);
			return;

		}

	}

}
package com.boonya.mina.simple;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MyServer {

	public static void main(String[] args) throws IOException {

		// 1.编写ioservice
		IoAcceptor acceptor = new NioSocketAcceptor();
		acceptor.getSessionConfig().setReadBufferSize(2048);
		// 读写通道在10秒内无任何操作进入空闲状态
		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

		// 2.编写过滤器,
		// 通过TextLineCodeFactory编解码工厂对字符串进行编解码处理
		acceptor.getFilterChain().addLast("codec",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset
						.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
						LineDelimiter.WINDOWS.getValue())));// 以换行符为标识的数据

		// 3.注册iohandler到ioservice
		acceptor.setHandler(new MyServerIoHandler());

		// 4绑定套接字
		acceptor.bind(new InetSocketAddress(1000));

	}

}

 

 

抱歉!评论已关闭.