Mina Server/Client 例子

Mina 需要mina.jar ,log4j.jar,slf4j.jar

 

Server端

package Server;

import java.net.InetSocketAddress;

import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaServer {
	
	public void init() throws Exception{
		SocketAcceptor acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1);
		//设置解析器
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
		
		acceptor.setHandler(new BexnHandler());
		acceptor.bind(new InetSocketAddress(8080));
		
	}
	public MinaServer() throws Exception {
		init();
	}
	
	public static void main(String[] args) throws Exception {
		new MinaServer();
		System.out.println("Server start");
	}
}

class BexnHandler extends IoHandlerAdapter{
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("messageReceived " + message);
		super.messageReceived(session, message);
		session.write("messageReceived "+message);
		session.closeOnFlush();
	}
	
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		if (session.isConnected()) {
			session.close();
		}
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		session.close();
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		super.sessionClosed(session); 
		System.out.println("sessionClosed");
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30000);
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		session.close();
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		super.sessionOpened(session);
	}
}


 

Client端

package Client;

import java.io.ObjectInputStream.GetField;
import java.net.ConnectException;
import java.net.InetSocketAddress;

import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.RuntimeIoException;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class MinaClient {
	public SocketConnector socketConnector;

	/**
	 * 缺省连接超时时间
	 */
	public static final int DEFAULT_CONNECT_TIMEOUT = 5;

	public static final String HOST = "localhost";

	public static final int PORT = 8080;

	public MinaClient() {
		init();
	}

	public void init() {
		socketConnector = new NioSocketConnector();

		// 长连接
		// socketConnector.getSessionConfig().setKeepAlive(true);

		socketConnector.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);

		socketConnector.setReaderIdleTime(DEFAULT_CONNECT_TIMEOUT);
		socketConnector.setWriterIdleTime(DEFAULT_CONNECT_TIMEOUT);
		socketConnector.setBothIdleTime(DEFAULT_CONNECT_TIMEOUT);

		socketConnector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
		
		ClientIoHandler ioHandler = new ClientIoHandler();
		socketConnector.setHandler(ioHandler);
	}

	public void sendMessage(final String msg) {
		InetSocketAddress addr = new InetSocketAddress(HOST, PORT);
		ConnectFuture cf = socketConnector.connect(addr);
		try {
			cf.awaitUninterruptibly();
			cf.getSession().write(msg);
			System.out.println("send message " + msg);
		} catch (RuntimeIoException e) {
			if (e.getCause() instanceof ConnectException) {
				try {
					if (cf.isConnected()) {
						cf.getSession().close();
					}
				} catch (RuntimeIoException e1) {
				}
			}
		}
	}

	public static void main(String[] args) throws InterruptedException {
		MinaClient clent = new MinaClient();
		for (int i = 0; i < 1; i++) {
			System.err.println(i);
			clent.sendMessage("Hello World " + i);
		}
		clent.getSocketConnector().dispose();
		//System.exit(0);
	}

	public SocketConnector getSocketConnector() {
		return socketConnector;
	}

	public void setSocketConnector(SocketConnector socketConnector) {
		this.socketConnector = socketConnector;
	}
	
	
}

class ClientIoHandler extends IoHandlerAdapter {

	private void releaseSession(IoSession session) throws Exception {
		System.out.println("releaseSession");
		if (session.isConnected()) {
			session.closeOnFlush();
		}
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("sessionOpened");
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("sessionClosed");
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("sessionIdle");
		try {
			releaseSession(session);
		} catch (RuntimeIoException e) {
		}
	}

	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("Receive Server message " + message);

		super.messageReceived(session, message);

		releaseSession(session);
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("exceptionCaught");
		cause.printStackTrace();
		releaseSession(session);
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("messageSent");
		super.messageSent(session, message);
	}

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值