SSLServerSocket代码实现
2016-02-01 16:57
411 查看
理解一个设计思想,结合代码是最好的途径。安全套接字服务端的实现代码如下:
客户端的代码实现如下:
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(); }
相关文章推荐
- Composer PHP的包管理器
- springmvc(十)springmvc和struts2的区别
- JDK的bin目录下那些常见工具使用集锦
- Python使用socket实现简单的文件传输并校验
- Java动态代理的实现机制
- 【java基础】Minor GC、Major GC和Full GC之间的区别
- C#委托,事件,接口,反射和关键字
- phpcms加载系统类与加载应用类之区别详解
- Struts2--标签
- 使用C#发送带附件的电子邮件的方法的代码示例分析
- Python第二讲基本数据类型
- thinkphp标签实现bootsrtap轮播carousel实例
- JAVA使用commos-fileupload实现文件上传与下载实例解析
- listview效果显示代码
- Java 反射使用
- php过滤提交数据 防止sql注入攻击
- Can I create an array whose component type is a concrete parameterized type? 我可以创建一个泛型数组嘛?
- Spring(AbstractRoutingDataSource)实现动态数据源切换--转载
- PHP删除目录及目录下所有文件或删除指定文件
- python packaging