转自:http://developer.51cto.com/art/201202/317547.htm

前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了。

 1 package com.googlecode.garbagecan.test.socket.ssl;
 2
 3 public class User implements java.io.Serializable {
 4     private static final long serialVersionUID = 1L;
 5     private String name;
 6     private String password;
 7
 8     public User() {
 9
10     }
11
12     public User(String name, String password) {
13         this.name = name;
14         this.password = password;
15     }
16
17     public String getName() {
18         return name;
19     }
20
21     public void setName(String name) {
22         this.name = name;
23     }
24
25     public String getPassword() {
26         return password;
27     }
28
29     public void setPassword(String password) {
30         this.password = password;
31     }
32
33 } 

SSL Server类,这里需要用到ServerSocketFactory类来创建SSLServerSocket类实例,然后在通过SSLServerSocket来获取SSLSocket实例,这里考虑到面向对象中的面向接口编程的理念,所以代码中并没有出现SSLServerSocket和SSLSocket,而是用了他们的父类ServerSocket和Socket。在获取到ServerSocket和Socket实例以后,剩下的代码就和不使用加密方式一样了。

 1 package com.googlecode.garbagecan.test.socket.ssl;
 2
 3 import java.io.BufferedInputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 import java.util.logging.Level;
10 import java.util.logging.Logger;
11
12 import javax.net.ServerSocketFactory;
13 import javax.net.ssl.SSLServerSocketFactory;
14
15 public class MyServer {
16
17     private final static Logger logger = Logger.getLogger(MyServer.class.getName());
18
19     public static void main(String[] args) {
20         try {
21             ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
22             ServerSocket server = factory.createServerSocket(10000);
23
24             while (true) {
25                 Socket socket = server.accept();
26                 invoke(socket);
27             }
28         } catch (Exception ex) {
29             ex.printStackTrace();
30         }
31     }
32
33     private static void invoke(final Socket socket) throws IOException {
34         new Thread(new Runnable() {
35             public void run() {
36                 ObjectInputStream is = null;
37                 ObjectOutputStream os = null;
38                 try {
39                     is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
40                     os = new ObjectOutputStream(socket.getOutputStream());
41
42                     Object obj = is.readObject();
43                     User user = (User)obj;
44                     System.out.println("user: " + user.getName() + "/" + user.getPassword());
45
46                     user.setName(user.getName() + "_new");
47                     user.setPassword(user.getPassword() + "_new");
48
49                     os.writeObject(user);
50                     os.flush();
51                 } catch (IOException ex) {
52                     logger.log(Level.SEVERE, null, ex);
53                 } catch(ClassNotFoundException ex) {
54                     logger.log(Level.SEVERE, null, ex);
55                 } finally {
56                     try {
57                         is.close();
58                     } catch(Exception ex) {}
59                     try {
60                         os.close();
61                     } catch(Exception ex) {}
62                     try {
63                         socket.close();
64                     } catch(Exception ex) {}
65                 }
66             }
67         }).start();
68     }
69 } 

SSL Client类和SSL Server类类似,只是将其中获取Socket的方式有所变化,其余的代码也和不使用加密方式一样。

 1 package com.googlecode.garbagecan.test.socket.ssl;
 2
 3 import java.io.BufferedInputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.net.Socket;
 8 import java.util.logging.Level;
 9 import java.util.logging.Logger;
10
11 import javax.net.SocketFactory;
12 import javax.net.ssl.SSLSocketFactory;
13
14 public class MyClient {
15
16 private final static Logger logger = Logger.getLogger(MyClient.class.getName());
17
18     public static void main(String[] args) throws Exception {
19         for (int i = 0; i < 100; i++) {
20             Socket socket = null;
21             ObjectOutputStream os = null;
22             ObjectInputStream is = null;
23
24             try {
25                 SocketFactory factory = SSLSocketFactory.getDefault();
26                 socket = factory.createSocket("localhost", 10000);
27
28                 os = new ObjectOutputStream(socket.getOutputStream());
29                 User user = new User("user_" + i, "password_" + i);
30                 os.writeObject(user);
31                 os.flush();
32
33                 is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
34                 Object obj = is.readObject();
35                 if (obj != null) {
36                     user = (User)obj;
37                     System.out.println("user: " + user.getName() + "/" + user.getPassword());
38                 }
39             } catch(IOException ex) {
40                 logger.log(Level.SEVERE, null, ex);
41             } finally {
42                 try {
43                     is.close();
44                 } catch(Exception ex) {}
45                 try {
46                     os.close();
47                 } catch(Exception ex) {}
48                 try {
49                     socket.close();
50                 } catch(Exception ex) {}
51             }
52         }
53     }
54 } 

代码写完了,下面就需要产生keystore文件了,运行下面的命令

  1. keytool -genkey -alias mysocket -keyalg RSA -keystore mysocket.jks

在提示输入项中,密码项自己给定,其它都不改直接回车,这里我使用的密码是“mysocket”。

运行Server

  1. java -Djavax.net.ssl.keyStore=mysocket.jks -Djavax.net.ssl.keyStorePassword=mysocket com.googlecode.garbagecan.test.socket.ssl.MyServer

运行Client

  1. java -Djavax.net.ssl.trustStore=mysocket.jks  -Djavax.net.ssl.trustStorePassword=mysocket com.googlecode.garbagecan.test.socket.ssl.MyClient

前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了。

转载于:https://www.cnblogs.com/sharpest/p/10055495.html

Java Socket实战之五:使用加密协议传输对象相关推荐

  1. java socket通信需要另外加密么_Java Socket实战之五 使用加密协议传输对象

    前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了. 还是一样需要一个实现了java.io.Serializable接 ...

  2. Java Socket实战之六 使用NIO包实现Socket通信

    2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7288896 Java S ...

  3. Java Socket实战之四 传输压缩对象

    2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7259834 Java S ...

  4. Java Socket实战之三:传输对象

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...

  5. [转载]Java Socket实战之二 多线程通信

    上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Clien ...

  6. Java Socket实战之一:单线程通信

    转自:http://developer.51cto.com/art/201202/317543.htm 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用sprin ...

  7. [置顶] Java Socket实战之一 单线程通信

    本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可 ...

  8. Java面试基础篇之java基础语法之五:类和对象

    目录 1. 类与对象的初步认知 2. 类和类的实例化 3. 类的成员 3.1 字段/属性/成员变量 3.2 方法 (method) 3.3 static 关键字 3.4 小结 4. 封装 4.1 pr ...

  9. Java中Socket通信-客户端与服务端相互传输对象数据

    场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...

最新文章

  1. LinkedList 真的是查找慢增删快?
  2. python笔记之面向对象
  3. 代码规范:在Keil5中使用代码格式化工具Astyle(插件)
  4. Linux -- 进程或线程独占CPU
  5. OpenStack创建win7实例遇到的问题(尚未解决,求帮助)
  6. linux学习之路(1)
  7. Provisioning Services最佳实践一 ----架构
  8. html css . doc,html+CSS基础.doc
  9. 基于matlab的高等数学,基于MATLAB的高等数学问题求解
  10. 软件设计模式期末大作业——可乐商城管理系统
  11. 学习mars3d的过程记录—配置环境
  12. LIC(最长子序列)
  13. 与其骑会三处。汉军不知羽所居
  14. 一维连续型随机变量的函数分布
  15. Java基础----【异常、线程】
  16. 中国半导体芯片产业布局图(2022版)-爱普搜汽车
  17. 5个 JavaScript 怪异行为及其原因
  18. VUE :class 动态class方法
  19. thinkphp一步提交ajax失败,Thinkphp无法获得AJAX post的数据,很简单的问题就是无法解决?...
  20. 某cms前台逻辑漏洞学习

热门文章

  1. markdown设置字体颜色大小、目录、列举和横线
  2. ​数据集拥有自己的世界观?不,其实还是人的世界观
  3. μ子刷屏的背后:说「新物理学即将现身」还为之过早
  4. 车联网支持实现无人驾驶的思考
  5. 华为汪涛:定义5.5G,构建美好智能世界
  6. 新书推荐:《追问人工智能:从剑桥到北京》
  7. AI人必看!89页全网最全清华知识图谱报告
  8. 一张图看懂微软人工智能
  9. 迷惑行为赏析:把 jpg 图片加密后卖了 247 万
  10. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩...