開源工具:Mina

      Apache Mina Server 是一個網絡通訊應用框架,也就是說,它主要是對基於TCP/IP、UDP/IP協議棧的通訊框架(然,也能夠提供JAVA 對象的序列化服務、虛擬機管道通訊服務等),Mina 能夠幫助咱們快速開發高性能、高擴展性的網絡通訊應用,Mina 提供了事件驅動、異步(Mina 的異步IO 默認使用的是JAVA NIO 做爲底層支持)操做的編程模型。Mina 主要有1.x 和2.x 兩個分支,這裏咱們講解最新版本2.0,若是你使用的是Mina 1.x,那麼可能會有一些功能並不適用。
      Mina 同時提供了網絡通訊的Server 端、Client 端的封裝。 java

eclipse下的代碼結構以下: apache

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	private String name;
	private int age;

	public User() {

	}

	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;


/**
 * 對象客戶端接受處理類
 * 
 * @author Royal
 * 
 */
public class ObjectMinaClientHandler extends IoHandlerAdapter {

	// 當一個服務端連結進入時
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("connect server : " + session.getRemoteAddress());
		session.write(new User("mina", 18));
	}

	// 當一個服務端關閉時
	@Override
	public void sessionClosed(IoSession session) {
		System.out.println(session.getRemoteAddress() + " server Disconnect !");
	}

	// 當服務器發送的消息到達時:
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		User u = (User) message;
		System.out.println("這裏是客戶端(" + session.getLocalAddress() + ")\t服務器(" + session.getRemoteAddress() + ")發來的消息: " + u.getName() + "\t" + u.getAge());

		// 發送到服務端
		session.write(u);
	}

}
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
 * mina測試客戶端
 * @author Royal
 *
 */
public class MinaClient {

	public static void main(String[] args) {

		// Create TCP/IP connector.
		IoConnector connector = new NioSocketConnector();
		// 建立接收數據的過濾器
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
		// 設定這個過濾器將以對象爲單位讀取數
		ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
		chain.addLast("objectFilter", filter);
		// 設定客戶端的消息處理器:一個ObjectMinaClientHandler對象,
		connector.setHandler(new ObjectMinaClientHandler());

		// 連結到服務器:
		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988));
		// 等待鏈接建立完成
		cf.awaitUninterruptibly();
		// 等待鏈接斷開
		cf.getSession().getCloseFuture().awaitUninterruptibly();

		// 客戶端斷開連接,釋放資源
		connector.dispose();
	}

}
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
 * 對象服務接受處理類
 * 
 * @author Royal
 * 
 */
public class ObjectMinaServerHandler extends IoHandlerAdapter {

	// 記錄接受數據的次數
	private int count = 0;

	/**
	 * 當客戶端 發送 的消息到達時
	 */
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {

		// 咱們己設定了服務器解析消息的規則一個User對象爲單位傳輸:
		User u = (User) message;
		System.out.println("這裏是服務器(" + session.getLocalAddress() + ")\t收到客戶機("
				+ session.getRemoteAddress() + ")發來的用戶對象:" + u.toString()
				+ "---------" + count);

		count++;
		if (count == 1000) {
			count = 0;
			// 服務器主動斷開與客戶端的鏈接
			session.close(true);
		}

		// 發送到客戶端
		session.write(u);
	}

	/**
	 * 當一個客戶端鏈接進入時
	 */
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("incomming client: " + session.getRemoteAddress());
	}

	/**
	 * 當一個客戶端關閉時
	 */
	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println(session.getRemoteAddress() + " client Disconnect!");
	}

	/**
	 * 當捕獲到異常的時候
	 */
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		System.err.println("error!!!!!!!!!!!!!");
		super.exceptionCaught(session, cause);
	}

}
import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * mina服務端
 * @author Royal
 *
 */
public class MinaServer {

	public static void main(String[] args) throws IOException {
		// 建立一個非阻塞的Server端 Socket,用NIO
		IoAcceptor acceptor = new NioSocketAcceptor();
		// 建立接收數據的過濾器
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		// 設定這個過濾器將以對象爲單位讀取數
		ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
		chain.addLast("objectFilter", filter);

		// 設定服務器端的消息處理器:一個ObjectMinaServerHandler對象,
		acceptor.setHandler(new ObjectMinaServerHandler());

		// 服務器端綁定的端口
		int bindPort = 9988;
		// 綁定端口,啓動服務器
		acceptor.bind(new InetSocketAddress(bindPort));
		System.out.println("Mina Server is Listing on:= " + bindPort);
	}

}

 

相關文章
相關標籤/搜索