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

  1. X509TrustManager MyX509TrustManager = new X509TrustManager() {
  2. public X509Certificate[] getAcceptedIssuers() {
  3. System.out.println("getAcceptedIssuers");
  4. return null;
  5. }
  6. public void checkServerTrusted(X509Certificate[] chain,
  7. String authType) throws CertificateException {
  8. System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
  9. }
  10. public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
  11. System.out.println("checkClientTrusted");
  12. }
  13. };
  14. try {
  15. //此文件是Keytool工具生成的证书(生成的路径在cmd目录下)
  16. String keyName = "C:/cnkey";
  17.     //String keyName = "cnkey";
  18. char[] keyPwd = "123456".toCharArray();
  19. KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
  20.      //可以直接在src路径下加载文件名为keyName的文件,返回输入流
  21. // Test2.class.getClassLoader().getResourceAsStream(keyName)
  22. // 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore
  23. InputStream in = new FileInputStream(keyName);
  24.  
  25. keyStore.load(in, keyPwd);
  26. in.close();
  27.  
  28. // 初始化key manager factory
  29. KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
  30. .getDefaultAlgorithm());
  31. kmf.init(keyStore, keyPwd);
  32.  
  33. // 初始化ssl context
  34. SSLContext context = SSLContext.getInstance("SSL");
  35. context.init(kmf.getKeyManagers(),
  36. new TrustManager[] { MyX509TrustManager },
  37. new SecureRandom());
  38.  
  39. // 监听和接收客户端连接
  40. SSLServerSocketFactory factory = context.getServerSocketFactory();
  41. SSLServerSocket server = (SSLServerSocket) factory
  42. .createServerSocket(10002);
  43. System.out.println("ok");
  44. Socket client = server.accept();
  45. System.out.println(client.getRemoteSocketAddress());
  46.  
  47. // 向客户端发送接收到的字节序列
  48. OutputStream output = client.getOutputStream();
  49.  
  50. // 当一个普通 socket 连接上来, 这里会抛出异常
  51. // Exception in thread "main" javax.net.ssl.SSLException: Unrecognized
  52. // SSL message, plaintext connection?
  53. InputStream input = client.getInputStream();
  54. byte[] buf = new byte[1024];
  55. int len = 0;
  56. while ((len = input.read(buf))!=-1) {
  57. String sf = new String(buf, 0, len);
  58. System.out.print(sf);
  59. if(sf.contains("\r\n\r\n")){
  60. break;
  61. }
  62. }
  63. String html = "<html><head><title>wv</title></head><body><h2>as</h2></body><html>";
  64. String s = "HTTP/1.1 200 OK" +
  65. "\r\n" +
  66. "Date: Sat, 31 Dec 2005 23:59:59 GMT" +
  67. "\r\n" +
  68. "Content-Type: text/html;charset=ISO-8859-1" +
  69. "\r\n" +
  70. "Content-Length: " +
  71. html.length() +
  72. "\r\n" +
  73. "\r\n" +
  74. html;
  75. output.write(s.getBytes());
  76. output.flush();
  77. output.close();
  78. input.close();
  79.  
  80. // 关闭socket连接
  81. client.close();
  82. server.close();
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. }

客户端的代码实现如下:

  1. X509TrustManager MyX509TrustManager = new X509TrustManager() {
  2. public X509Certificate[] getAcceptedIssuers() {
  3. System.out.println("getAcceptedIssuers");
  4. return null;
  5. }
  6. public void checkServerTrusted(X509Certificate[] chain,
  7. String authType) throws CertificateException {
  8. System.out.println("checkServerTrusted:"+authType+"////"+chain.length);
  9. }
  10. public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {
  11. System.out.println("checkClientTrusted");
  12. }
  13. };
  14. try {
  15. SSLContext context = SSLContext.getInstance("SSL");
  16. // 初始化
  17. context.init(null,new TrustManager[] { MyX509TrustManager },new SecureRandom());
  18. SSLSocketFactory factory = context.getSocketFactory();
  19. SSLSocket s = (SSLSocket) factory.createSocket("localhost", 10002);
  20. System.out.println("ok");
  21.  
  22. OutputStream output = s.getOutputStream();
  23. InputStream input = s.getInputStream();
  24.  
  25. output.write("alert\r\n\r\n".getBytes());
  26. System.out.println("sent: alert");
  27. output.flush();
  28. byte[] buf = new byte[1024];
  29. int len = 0;
  30. while ((len = input.read(buf))!=-1) {
  31. System.out.println("received:" + new String(buf, 0, len));
  32. }
  33.  
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }

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. dom元素操作(动态事件绑定)

    遇到的问题:动态生成的内容,事件绑定会出错. 例子:http://snowinmay.net/jqm/dom-learn2.html 1.绑定事件对动态生成的新元素无效. 问题描述:bind事件绑定后 ...

  2. D - Pagodas

    n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...

  3. Python赋值与深浅拷贝

    赋值: >> a = [1, 2, 3] >>> b = a >>> a = [4, 5, 6] //赋新的值给 a >>> a [4 ...

  4. EXSI中Linux安装tools

    挂载 mount /dev/cdrom /mnt/ 进入挂载目录复制安装包 cp VMwareTools-10.2.1-8267844.tar.gz /tmp/ 解压安装 cd /tmp/ tar - ...

  5. 逻辑卷管理LVM(logical volume manager)

    LVM的全名是logical volume manager,中文翻译逻辑卷管理器.之所以称为卷是因为可以将文件系统像卷一样伸长和缩短,LVM的做法是将几个物理的分区(或磁盘)通过软件组合成为一块独立的 ...

  6. Codeforces 1032 - A/B/C/D/E - (Undone)

    链接:http://codeforces.com/contest/1032/ 是真的真的真的忍不住想吐槽这题意是真的真的真的读不懂…… A - Kitchen Utensils - [简单数学题] 题 ...

  7. python中的os.path.dirname(__file__)的使用

    在编程时,我们要获取当前文件所在的路径,以适合所有的工程,建立相对路径. python的os.path.dirname(__file__)非常好用,建议大家使用: import os FILE = o ...

  8. 2012年蓝桥杯省赛A组c++第4题(电视台答题比赛)

    /* 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度. 答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须回答问题,不 ...

  9. 表单中Readonly和Disabled的区别:readonly在get和post可传值到后端,disabled不可

    http://www.nowamagic.net/html/html_ReadonlyAndDisabled.php Readonly和Disabled是用在表单中的两个属性,它们都能够做到使用户不能 ...

  10. python之gunicorn的配置

    https://www.cnblogs.com/cwp-bg/p/8780204.html python常见的web部署搭配nginx+gunicorn,下面记录一下gunicorn的配置使用. 安装 ...