Java Socket使用加密协议进行传输对象的方法
本文实例讲述了JavaSocket使用加密协议进行传输对象的方法。分享给大家供大家参考,具体如下:
前面的几篇文章介绍了Socket中一些常见的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到SSLSocket了。
还是一样需要一个实现了Java.io.Serializable接口的简单Java对象
packagecom.googlecode.garbagecan.test.socket.ssl;
publicclassUserimplementsjava.io.Serializable{
privatestaticfinallongserialVersionUID=1L;
privateStringname;
privateStringpassword;
publicUser(){
}
publicUser(Stringname,Stringpassword){
this.name=name;
this.password=password;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
SSLServer类,这里需要用到ServerSocketFactory类来创建SSLServerSocket类实例,然后在通过SSLServerSocket来获取SSLSocket实例,这里考虑到面向对象中的面向接口编程的理念,所以代码中并没有出现SSLServerSocket和SSLSocket,而是用了他们的父类ServerSocket和Socket。在获取到ServerSocket和Socket实例以后,剩下的代码就和不使用加密方式一样了。
packagecom.googlecode.garbagecan.test.socket.ssl;
importjava.io.BufferedInputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.logging.Level;
importjava.util.logging.Logger;
importjavax.net.ServerSocketFactory;
importjavax.net.ssl.SSLServerSocketFactory;
publicclassMyServer{
privatefinalstaticLoggerlogger=Logger.getLogger(MyServer.class.getName());
publicstaticvoidmain(String[]args){
try{
ServerSocketFactoryfactory=SSLServerSocketFactory.getDefault();
ServerSocketserver=factory.createServerSocket(10000);
while(true){
Socketsocket=server.accept();
invoke(socket);
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
privatestaticvoidinvoke(finalSocketsocket)throwsIOException{
newThread(newRunnable(){
publicvoidrun(){
ObjectInputStreamis=null;
ObjectOutputStreamos=null;
try{
is=newObjectInputStream(newBufferedInputStream(socket.getInputStream()));
os=newObjectOutputStream(socket.getOutputStream());
Objectobj=is.readObject();
Useruser=(User)obj;
System.out.println("user:"+user.getName()+"/"+user.getPassword());
user.setName(user.getName()+"_new");
user.setPassword(user.getPassword()+"_new");
os.writeObject(user);
os.flush();
}catch(IOExceptionex){
logger.log(Level.SEVERE,null,ex);
}catch(ClassNotFoundExceptionex){
logger.log(Level.SEVERE,null,ex);
}finally{
try{
is.close();
}catch(Exceptionex){}
try{
os.close();
}catch(Exceptionex){}
try{
socket.close();
}catch(Exceptionex){}
}
}
}).start();
}
}
SSLClient类和SSLServer类类似,只是将其中获取Socket的方式有所变化,其余的代码也和不使用加密方式一样。
packagecom.googlecode.garbagecan.test.socket.ssl;
importjava.io.BufferedInputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.Socket;
importjava.util.logging.Level;
importjava.util.logging.Logger;
importjavax.net.SocketFactory;
importjavax.net.ssl.SSLSocketFactory;
publicclassMyClient{
privatefinalstaticLoggerlogger=Logger.getLogger(MyClient.class.getName());
publicstaticvoidmain(String[]args)throwsException{
for(inti=0;i<100;i++){
Socketsocket=null;
ObjectOutputStreamos=null;
ObjectInputStreamis=null;
try{
SocketFactoryfactory=SSLSocketFactory.getDefault();
socket=factory.createSocket("localhost",10000);
os=newObjectOutputStream(socket.getOutputStream());
Useruser=newUser("user_"+i,"password_"+i);
os.writeObject(user);
os.flush();
is=newObjectInputStream(newBufferedInputStream(socket.getInputStream()));
Objectobj=is.readObject();
if(obj!=null){
user=(User)obj;
System.out.println("user:"+user.getName()+"/"+user.getPassword());
}
}catch(IOExceptionex){
logger.log(Level.SEVERE,null,ex);
}finally{
try{
is.close();
}catch(Exceptionex){}
try{
os.close();
}catch(Exceptionex){}
try{
socket.close();
}catch(Exceptionex){}
}
}
}
}
代码写完了,下面就需要产生keystore文件了,运行下面的命令
keytool-genkey-aliasmysocket-keyalgRSA-keystoremysocket.jks
在提示输入项中,密码项自己给定,其它都不改直接回车,这里我使用的密码是“mysocket”。
运行Server
java-Djavax.net.ssl.keyStore=mysocket.jks-Djavax.net.ssl.keyStorePassword=mysocketcom.googlecode.garbagecan.test.socket.ssl.MyServer
运行Client
java-Djavax.net.ssl.trustStore=mysocket.jks -Djavax.net.ssl.trustStorePassword=mysocketcom.googlecode.garbagecan.test.socket.ssl.MyClient
PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:
文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password
在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多关于java相关内容感兴趣的读者可查看本站专题:《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。