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

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

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

还是一样需要一个实现了java.io.Serializable接口的简单Java对象:

 
  1. packagecom.googlecode.garbagecan.test.socket.ssl;
  2. publicclassUserimplementsjava.io.Serializable{
  3. privatestaticfinallongserialVersionUID=1L;
  4. privateStringname;
  5. privateStringpassword;
  6. publicUser(){
  7. }
  8. publicUser(Stringname,Stringpassword){
  9. this.name=name;
  10. this.password=password;
  11. }
  12. publicStringgetName(){
  13. returnname;
  14. }
  15. publicvoidsetName(Stringname){
  16. this.name=name;
  17. }
  18. publicStringgetPassword(){
  19. returnpassword;
  20. }
  21. publicvoidsetPassword(Stringpassword){
  22. this.password=password;
  23. }
  24. }

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

 
  1. packagecom.googlecode.garbagecan.test.socket.ssl;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.IOException;
  4. importjava.io.ObjectInputStream;
  5. importjava.io.ObjectOutputStream;
  6. importjava.net.ServerSocket;
  7. importjava.net.Socket;
  8. importjava.util.logging.Level;
  9. importjava.util.logging.Logger;
  10. importjavax.net.ServerSocketFactory;
  11. importjavax.net.ssl.SSLServerSocketFactory;
  12. publicclassMyServer{
  13. privatefinalstaticLoggerlogger=Logger.getLogger(MyServer.class.getName());
  14. publicstaticvoidmain(String[]args){
  15. try{
  16. ServerSocketFactoryfactory=SSLServerSocketFactory.getDefault();
  17. ServerSocketserver=factory.createServerSocket(10000);
  18. while(true){
  19. Socketsocket=server.accept();
  20. invoke(socket);
  21. }
  22. }catch(Exceptionex){
  23. ex.printStackTrace();
  24. }
  25. }
  26. privatestaticvoidinvoke(finalSocketsocket)throwsIOException{
  27. newThread(newRunnable(){
  28. publicvoidrun(){
  29. ObjectInputStreamis=null;
  30. ObjectOutputStreamos=null;
  31. try{
  32. is=newObjectInputStream(newBufferedInputStream(socket.getInputStream()));
  33. os=newObjectOutputStream(socket.getOutputStream());
  34. Objectobj=is.readObject();
  35. Useruser=(User)obj;
  36. System.out.println("user:"+user.getName()+"/"+user.getPassword());
  37. user.setName(user.getName()+"_new");
  38. user.setPassword(user.getPassword()+"_new");
  39. os.writeObject(user);
  40. os.flush();
  41. }catch(IOExceptionex){
  42. logger.log(Level.SEVERE,null,ex);
  43. }catch(ClassNotFoundExceptionex){
  44. logger.log(Level.SEVERE,null,ex);
  45. }finally{
  46. try{
  47. is.close();
  48. }catch(Exceptionex){}
  49. try{
  50. os.close();
  51. }catch(Exceptionex){}
  52. try{
  53. socket.close();
  54. }catch(Exceptionex){}
  55. }
  56. }
  57. }).start();
  58. }
  59. }

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

 
  1. packagecom.googlecode.garbagecan.test.socket.ssl;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.IOException;
  4. importjava.io.ObjectInputStream;
  5. importjava.io.ObjectOutputStream;
  6. importjava.net.Socket;
  7. importjava.util.logging.Level;
  8. importjava.util.logging.Logger;
  9. importjavax.net.SocketFactory;
  10. importjavax.net.ssl.SSLSocketFactory;
  11. publicclassMyClient{
  12. privatefinalstaticLoggerlogger=Logger.getLogger(MyClient.class.getName());
  13. publicstaticvoidmain(String[]args)throwsException{
  14. for(inti=0;i<100;i++){
  15. Socketsocket=null;
  16. ObjectOutputStreamos=null;
  17. ObjectInputStreamis=null;
  18. try{
  19. SocketFactoryfactory=SSLSocketFactory.getDefault();
  20. socket=factory.createSocket("localhost",10000);
  21. os=newObjectOutputStream(socket.getOutputStream());
  22. Useruser=newUser("user_"+i,"password_"+i);
  23. os.writeObject(user);
  24. os.flush();
  25. is=newObjectInputStream(newBufferedInputStream(socket.getInputStream()));
  26. Objectobj=is.readObject();
  27. if(obj!=null){
  28. user=(User)obj;
  29. System.out.println("user:"+user.getName()+"/"+user.getPassword());
  30. }
  31. }catch(IOExceptionex){
  32. logger.log(Level.SEVERE,null,ex);
  33. }finally{
  34. try{
  35. is.close();
  36. }catch(Exceptionex){}
  37. try{
  38. os.close();
  39. }catch(Exceptionex){}
  40. try{
  41. socket.close();
  42. }catch(Exceptionex){}
  43. }
  44. }
  45. }
  46. }

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

 
  1. keytool-genkey-aliasmysocket-keyalgRSA-keystoremysocket.jks

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

运行Server

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

运行Client

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

原文链接:http://blog.csdn.net/kongxx/article/details/7259837


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值