SSLServerSocket代码实现

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

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 = input.read(buf);
        if (len!=-1) {
            System.out.println("received: " + new String(buf, 0, len));
        }
        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();
        }
时间: 2024-11-06 12:13:38

SSLServerSocket代码实现的相关文章

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

前记: 相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. 只是当时我所面临的应用场景有些特殊, 为了测试服务的性能和调试功能方便, 特地写了APNS的桩服务(其实主要原因是当时的iphone测试机, 被小组长"霸占"占为己用, ⊙﹏⊙b汗). 在此写一篇关于APNS桩服务的文章, 以此纪念逝去的"青春", 也希望对读者有所帮

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

Java-JSSE-SSL/TLS编程代码实例-双向认证

关于SSL/TLS/JSSE的介绍: 1)SSL/TLS协议运行机制 2)图解SSL/TLS协议 3)使用wireshark观察SSL/TLS握手过程 4)SSL/TLS的Java实现--JSSE (一)使用keytool创建密钥库 使用双向认证的SSL/TLS协议通信,客户端和服务器端都要设置用于证实自己身份的安全证书,并且还要设置信任对方的哪些安全证书. 理论上一共需要准备四个文件,两个keystore文件和两个truststore文件. 通信双方分别拥有一个keystore和一个trust

Java-JSSE-SSL/TLS编程代码实例-单向认证

前一篇介绍了SSL/TLS双向认证的代码实例. 也可以选择使用单向认证,这种情况下client侧不需要提供证书.所以, server侧只需要自己的keystore文件,不需要truststore文件 client侧不需要自己的keystore文件,只需要truststore文件(其中包含server的公钥). 此外server侧需要在创建SSLServerSocket之后设定不需要客户端证书:setNeedClientAuth(false) server代码 package learning.n

Xcode 快速开发 代码块 快捷键

Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便. 常用的: 1.strong:@property (nonatomic,strong) <#Class#> *<#object#>;2.weak:@property (nonatomic,weak) <#Class#> *<#object#>;3.copy:@property (nonatomic,copy) NSString *<#s

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;

微信支付PHP SDK —— 公众号支付代码详解

在微信支付 开发者文档页面 下载最新的 php SDK http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请求的哪个文件所在的目录. 例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号. 正式的支付授权目录不能和测试的一样否则会报错.不填

如何上传代码到github?

如何上传代码到github? 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://git-for-windows.github.io/ 1.进入Github首页,点击New repository新建一个项目  2.填写相应信息后点击create即可 Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public,

自己写的代码会写了,还是太渣,复杂度什么的直接报表

原题目是这样子的,本人按照一贯的作风想得很简单 #include<iostream> using namespace std; void H(int n) { while (n > 1) { if (n % 2 == 0) //这一步把取余和除法弄混淆. { cout << n << " "; n = n / 2; } else { cout << n << " "; n = 3 * n + 1; }