`
sariel
  • 浏览: 52834 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于 MINA 的 TLS/SSL NIO Socket 实现(一)

    博客分类:
  • Java
阅读更多
功能: 服务器启动后只支持 TLS/SSL 方式连接(不接受普通连接)
备注: TLS/SSL 实现是基于 MINA 的官方例子
地址: http://mina.apache.org/


客户端和服务器端通信内容:
客户端:我是安全的吗?
服务器:安全链接已建立!

服务器端代码:
package com.sariel.tls.server;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import com.sariel.tls.BogusSslContextFactory;

public class TLSServer {

	private static final int PORT = 50003;

	public static void main(String[] args) throws Exception {
		/** 创建服务器端连接器 **/
		SocketAcceptor acceptor = new NioSocketAcceptor();
		acceptor.setReuseAddress(true);
		/** 获取默认过滤器 **/
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		SslFilter sslFilter = new SslFilter(BogusSslContextFactory.getInstance(true));
		/** 设置加密过滤器 **/
		chain.addLast("sslFilter", sslFilter);
		/** 设置编码过滤器和按行读取数据模式 **/
		chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		/** 设置事件处理器 **/
		acceptor.setHandler(new TLSServerHandler());
		/** 服务绑定到此端口号 **/
		acceptor.bind(new InetSocketAddress(PORT));
		System.out.println("服务器在 [" + PORT + "] 等待连接...");
	}
}

package com.sariel.tls.server;

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

public class TLSServerHandler extends IoHandlerAdapter {
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionCreated");
	}

	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionOpened");
	}

	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionClosed");
	}

	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("[NIO Server]>> sessionIdle");
	}

	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("[NIO Server]>> exceptionCaught :");
		cause.printStackTrace();
	}

	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Server]>> messageReceived");
		System.out.println("[NIO Server Received]>> : "+(String) message);
		session.write("安全链接已建立!");
	}

	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Server]>> messageSent");
		System.out.println("[NIO Server messageSent]>> : " + (String) message);
	}
}

客户端代码:
package com.sariel.tls.client;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import com.sariel.tls.BogusSslContextFactory;

public class TLSClient {

	private static final int PORT = 50003;

	private static final String TARGET_IP = "192.168.12.41";

	public static void main(String[] args) throws GeneralSecurityException {
		/** 创建客户端连接器 **/
		IoConnector connector = new NioSocketConnector();
		SslFilter connectorTLSFilter = new SslFilter(BogusSslContextFactory.getInstance(false));
		/** 设置为客户端模式 **/
		connectorTLSFilter.setUseClientMode(true);
		/** 设置加密过滤器 **/
		connector.getFilterChain().addLast("SSL", connectorTLSFilter);
		/** 设置事件处理器 **/
		connector.setHandler(new TLSClientHandler());
		/** 设置编码过滤器和按行读取数据模式 **/
		connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		/** 创建连接 **/
		ConnectFuture future = connector.connect(new InetSocketAddress(TARGET_IP, PORT));
		/** 等待连接创建完成 **/
		future.awaitUninterruptibly();
		/** 获取连接会话 **/
		IoSession session = future.getSession();
		/** 发送信息 **/
		session.write("我是安全的吗?");
		/** 等待连接断开 **/
		session.getCloseFuture().awaitUninterruptibly();
		connector.dispose();
	}
}

package com.sariel.tls.client;

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

public class TLSClientHandler extends IoHandlerAdapter {
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionCreated");
	}

	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionOpened");
	}

	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionClosed");
	}

	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("[NIO Client]>> sessionIdle");
	}

	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("[NIO Client]>> exceptionCaught :");
		cause.printStackTrace();
	}

	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Client]>> messageReceived");
		System.out.println("[NIO Client Received]>>" + (String) message);
	}

	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Client]>> messageSent");
		System.out.println("[NIO Client messageSent]>> : " + (String) message);
	}
}

源文件下载地址:http://sariel.iteye.com/blog/470383
或直接下载地址:http://dl.iteye.com/topics/download/432bf891-ec7c-31be-a7a4-ec1f67a4dd9d
分享到:
评论
1 楼 allenny 2011-07-18  
证书呢,证书在哪里?

相关推荐

Global site tag (gtag.js) - Google Analytics