理解一个设计思想,结合代码是最好的途径。安全套接字服务端的实现代码如下:

X509TrustManager MyX509TrustManager = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
System.out.println("getAcceptedIssuers");
return null;
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
}
public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
System.out.println("checkClientTrusted");
}
};
try {
//此文件是Keytool工具生成的证书(生成的路径在cmd目录下)
String keyName = "C:/cnkey";
    //String keyName = "cnkey";
char[] keyPwd = "123456".toCharArray();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
     //可以直接在src路径下加载文件名为keyName的文件,返回输入流
// Test2.class.getClassLoader().getResourceAsStream(keyName)
// 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore
InputStream in = new FileInputStream(keyName); keyStore.load(in, keyPwd);
in.close(); // 初始化key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
.getDefaultAlgorithm());
kmf.init(keyStore, keyPwd); // 初始化ssl context
SSLContext context = SSLContext.getInstance("SSL");
context.init(kmf.getKeyManagers(),
new TrustManager[] { MyX509TrustManager },
new SecureRandom()); // 监听和接收客户端连接
SSLServerSocketFactory factory = context.getServerSocketFactory();
SSLServerSocket server = (SSLServerSocket) factory
.createServerSocket(10002);
System.out.println("ok");
Socket client = server.accept();
System.out.println(client.getRemoteSocketAddress()); // 向客户端发送接收到的字节序列
OutputStream output = client.getOutputStream(); // 当一个普通 socket 连接上来, 这里会抛出异常
// Exception in thread "main" javax.net.ssl.SSLException: Unrecognized
// SSL message, plaintext connection?
InputStream input = client.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = input.read(buf))!=-1) {
String sf = new String(buf, 0, len);
System.out.print(sf);
if(sf.contains("\r\n\r\n")){
break;
}
}
String html = "<html><head><title>wv</title></head><body><h2>as</h2></body><html>";
String s = "HTTP/1.1 200 OK" +
"\r\n" +
"Date: Sat, 31 Dec 2005 23:59:59 GMT" +
"\r\n" +
"Content-Type: text/html;charset=ISO-8859-1" +
"\r\n" +
"Content-Length: " +
html.length() +
"\r\n" +
"\r\n" +
html;
output.write(s.getBytes());
output.flush();
output.close();
input.close(); // 关闭socket连接
client.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
}

客户端的代码实现如下:

X509TrustManager MyX509TrustManager = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
System.out.println("getAcceptedIssuers");
return null;
}
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
}
public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
System.out.println("checkClientTrusted");
}
};
try {
SSLContext context = SSLContext.getInstance("SSL");
// 初始化
context.init(null,new TrustManager[] { MyX509TrustManager },new SecureRandom());
SSLSocketFactory factory = context.getSocketFactory();
SSLSocket s = (SSLSocket) factory.createSocket("localhost", 10002);
System.out.println("ok"); OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream(); output.write("alert\r\n\r\n".getBytes());
System.out.println("sent: alert");
output.flush();
byte[] buf = new byte[1024];
int len = 0;
while ((len = input.read(buf))!=-1) {
System.out.println("received:" + new String(buf, 0, len));
} } catch (Exception e) {
e.printStackTrace();
}

SSLServerSocket代码实现的更多相关文章

  1. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  2. 移动互联网实战--Apple的APNS桩推送服务的实现(2)

    前记: 相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. ...

  3. Android 用SSL构建安全的Socket

    SSL(安全套接层)是 Netscape公司在1994年开发的,最初用于WEB浏览器,为浏览器与服务器间的数据传递提供安全保障,提供了加密.来源认证和数据完整性的功能.现在SSL3.0得到了普遍的使用 ...

  4. 日期格式代码出现两次的错误 ORA-01810

    错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...

  5. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  6. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  7. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  8. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  9. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

随机推荐

  1. 多线程局部变量之threading.local()用法

    假如,开了十个线程并且做同样的一件事,他们需要带着自己的数据进来,完成事情后带着自己的数据出去.如果是并发,同时进来,他们的数据就会混乱. 一般情况,我们加锁就可以了,一个人先进来,先加锁,另一个人过 ...

  2. 学习markdown语法

    12.内部跳转 [这是一个按钮](#测试标题) - 1 - 1 - 1 # 测试标题 这是一个按钮 1 1 1 测试标题 注:使用-代替空格

  3. js函数 eql,equal,equalp

    function eql(obj, other) { if(stringp(obj) && stringp(other) && obj === other) retur ...

  4. CentOS7 vsftpd 安装及配置

    0x:卸载vsftpd [root@localhost ~]# yum remove vsftpd [root@localhost ~]# find / -name "vsftpd*&quo ...

  5. ASP.NET Core Web API处理HttpResponseMessage类型返回值的问题

    在将我们的 web api 从 .NET Framework 迁移至 .net core(asp.net core 1.1)之后,遇到一个问题. 之前返回值类型为 HttpResponseMessag ...

  6. pytorch的torch.utils.data.DataLoader认识

    PyTorch中数据读取的一个重要接口是torch.utils.data.DataLoader,该接口定义在dataloader.py脚本中,只要是用PyTorch来训练模型基本都会用到该接口, 该接 ...

  7. 【魔改】树状数组 牛客多校第五场I vcd 几何+阅读理解

    https://www.nowcoder.com/acm/contest/143/I vc-dimension 题解:分三种情况,组合数学算一下,其中一种要用树状数组维护 技巧(来自UESTC):1. ...

  8. 湘潭大学校赛H-统计颜色 线段树

    链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...

  9. C和C指针小记(三)-整型,char,枚举

    1.C语言基本数据类型-整型 仅有4中机泵数据类型:整型,浮点型,指针,聚合类型(数组和结构) 整型家族:字符,短整型,整型,长整型.(都分有符号[singed]和无符号[unsinged]) 短整型 ...

  10. 在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化

    在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化 1 结点的描述与实现 C语言中用带指针的结构体类型来描述 typedef struct Lnode { ...