Java Socket实战之五:使用加密协议传输对象
转自: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文件了,运行下面的命令
- keytool -genkey -alias mysocket -keyalg RSA -keystore mysocket.jks
在提示输入项中,密码项自己给定,其它都不改直接回车,这里我使用的密码是“mysocket”。
运行Server
- java -Djavax.net.ssl.keyStore=mysocket.jks -Djavax.net.ssl.keyStorePassword=mysocket com.googlecode.garbagecan.test.socket.ssl.MyServer
运行Client
- 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实战之五:使用加密协议传输对象相关推荐
- java socket通信需要另外加密么_Java Socket实战之五 使用加密协议传输对象
前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了. 还是一样需要一个实现了java.io.Serializable接 ...
- Java Socket实战之六 使用NIO包实现Socket通信
2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7288896 Java S ...
- Java Socket实战之四 传输压缩对象
2019独角兽企业重金招聘Python工程师标准>>> 本文地址:http://blog.csdn.net/kongxx/article/details/7259834 Java S ...
- Java Socket实战之三:传输对象
转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...
- [转载]Java Socket实战之二 多线程通信
上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Clien ...
- Java Socket实战之一:单线程通信
转自:http://developer.51cto.com/art/201202/317543.htm 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可以用sprin ...
- [置顶] Java Socket实战之一 单线程通信
本文地址:http://blog.csdn.net/kongxx/article/details/7259436 现在做Java直接使用Socket的情况是越来越少,因为有很多的选择可选,比如说可 ...
- Java面试基础篇之java基础语法之五:类和对象
目录 1. 类与对象的初步认知 2. 类和类的实例化 3. 类的成员 3.1 字段/属性/成员变量 3.2 方法 (method) 3.3 static 关键字 3.4 小结 4. 封装 4.1 pr ...
- Java中Socket通信-客户端与服务端相互传输对象数据
场景 Java中Socket通信-服务端和客户端双向传输字符串实现: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1084885 ...
最新文章
- LinkedList 真的是查找慢增删快?
- python笔记之面向对象
- 代码规范:在Keil5中使用代码格式化工具Astyle(插件)
- Linux -- 进程或线程独占CPU
- OpenStack创建win7实例遇到的问题(尚未解决,求帮助)
- linux学习之路(1)
- Provisioning Services最佳实践一 ----架构
- html css . doc,html+CSS基础.doc
- 基于matlab的高等数学,基于MATLAB的高等数学问题求解
- 软件设计模式期末大作业——可乐商城管理系统
- 学习mars3d的过程记录—配置环境
- LIC(最长子序列)
- 与其骑会三处。汉军不知羽所居
- 一维连续型随机变量的函数分布
- Java基础----【异常、线程】
- 中国半导体芯片产业布局图(2022版)-爱普搜汽车
- 5个 JavaScript 怪异行为及其原因
- VUE :class 动态class方法
- thinkphp一步提交ajax失败,Thinkphp无法获得AJAX post的数据,很简单的问题就是无法解决?...
- 某cms前台逻辑漏洞学习
热门文章
- markdown设置字体颜色大小、目录、列举和横线
- ​数据集拥有自己的世界观?不,其实还是人的世界观
- μ子刷屏的背后:说「新物理学即将现身」还为之过早
- 车联网支持实现无人驾驶的思考
- 华为汪涛:定义5.5G,构建美好智能世界
- 新书推荐:《追问人工智能:从剑桥到北京》
- AI人必看!89页全网最全清华知识图谱报告
- 一张图看懂微软人工智能
- 迷惑行为赏析:把 jpg 图片加密后卖了 247 万
- 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩...