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

[color=blue]功能: 服务器启动后只支持 TLS/SSL 方式连接[/color][color=darkred](不接受普通连接)[/color]
[color=blue]备注: TLS/SSL 实现是基于 MINA 的官方例子
地址: http://mina.apache.org/[/color]

[color=darkred]客户端和服务器端通信内容:[/color]
[color=violet]客户端:我是安全的吗?[/color]
[color=green]服务器:安全链接已建立![/color]

[color=darkred]服务器端代码:[/color]

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);
}
}

[color=darkred]客户端代码:[/color]

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);
}
}

源文件下载地址:[url]http://sariel.iteye.com/blog/470383[/url]
或直接下载地址:[url]http://dl.iteye.com/topics/download/432bf891-ec7c-31be-a7a4-ec1f67a4dd9d[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值