欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java Socket使用加密协议进行传输对象的方法

程序员文章站 2023-12-12 14:59:04
本文实例讲述了java socket使用加密协议进行传输对象的方法。分享给大家供大家参考,具体如下: 前面的几篇文章介绍了socket中一些常见的用法,但是对于一些有安全...

本文实例讲述了java socket使用加密协议进行传输对象的方法。分享给大家供大家参考,具体如下:

前面的几篇文章介绍了socket中一些常见的用法,但是对于一些有安全要求的应用就需要加密传输的数据,此时就需要用到sslsocket了。

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

package com.googlecode.garbagecan.test.socket.ssl;
public class user implements java.io.serializable {
  private static final long serialversionuid = 1l;
  private string name;
  private string password;
  public user() {
  }
  public user(string name, string password) {
    this.name = name;
    this.password = password;
  }
  public string getname() {
    return name;
  }
  public void setname(string name) {
    this.name = name;
  }
  public string getpassword() {
    return password;
  }
  public void setpassword(string password) {
    this.password = password;
  }
}

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

package com.googlecode.garbagecan.test.socket.ssl;
import java.io.bufferedinputstream;
import java.io.ioexception;
import java.io.objectinputstream;
import java.io.objectoutputstream;
import java.net.serversocket;
import java.net.socket;
import java.util.logging.level;
import java.util.logging.logger;
import javax.net.serversocketfactory;
import javax.net.ssl.sslserversocketfactory;
public class myserver {
  private final static logger logger = logger.getlogger(myserver.class.getname());
  public static void main(string[] args) {
    try {
      serversocketfactory factory = sslserversocketfactory.getdefault();
      serversocket server = factory.createserversocket(10000);
      while (true) {
        socket socket = server.accept();
        invoke(socket);
      }
    } catch (exception ex) {
      ex.printstacktrace();
    }
  }
  private static void invoke(final socket socket) throws ioexception {
    new thread(new runnable() {
      public void run() {
        objectinputstream is = null;
        objectoutputstream os = null;
        try {
          is = new objectinputstream(new bufferedinputstream(socket.getinputstream()));
          os = new objectoutputstream(socket.getoutputstream());
          object obj = is.readobject();
          user user = (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 (ioexception ex) {
          logger.log(level.severe, null, ex);
        } catch(classnotfoundexception ex) {
          logger.log(level.severe, null, ex);
        } finally {
          try {
            is.close();
          } catch(exception ex) {}
          try {
            os.close();
          } catch(exception ex) {}
          try {
            socket.close();
          } catch(exception ex) {}
        }
      }
    }).start();
  }
}

ssl client类和ssl server类类似,只是将其中获取socket的方式有所变化,其余的代码也和不使用加密方式一样。

package com.googlecode.garbagecan.test.socket.ssl;
import java.io.bufferedinputstream;
import java.io.ioexception;
import java.io.objectinputstream;
import java.io.objectoutputstream;
import java.net.socket;
import java.util.logging.level;
import java.util.logging.logger;
import javax.net.socketfactory;
import javax.net.ssl.sslsocketfactory;
public class myclient {
private final static logger logger = logger.getlogger(myclient.class.getname());
  public static void main(string[] args) throws exception {
    for (int i = 0; i < 100; i++) {
      socket socket = null;
      objectoutputstream os = null;
      objectinputstream is = null;
      try {
        socketfactory factory = sslsocketfactory.getdefault();
        socket = factory.createsocket("localhost", 10000);
        os = new objectoutputstream(socket.getoutputstream());
        user user = new user("user_" + i, "password_" + i);
        os.writeobject(user);
        os.flush();
        is = new objectinputstream(new bufferedinputstream(socket.getinputstream()));
        object obj = is.readobject();
        if (obj != null) {
          user = (user)obj;
          system.out.println("user: " + user.getname() + "/" + user.getpassword());
        }
      } catch(ioexception ex) {
        logger.log(level.severe, null, ex);
      } finally {
        try {
          is.close();
        } catch(exception ex) {}
        try {
          os.close();
        } catch(exception ex) {}
        try {
          socket.close();
        } catch(exception ex) {}
      }
    }
  }
}

代码写完了,下面就需要产生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

ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:

文字在线加密解密工具(包含aes、des、rc4等):

md5在线加密工具:
http://tools.jb51.net/password/createmd5password

在线散列/哈希算法加密工具:

在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具:

更多关于java相关内容感兴趣的读者可查看本站专题:《java socket编程技巧总结》、《java文件与目录操作技巧汇总》、《java数据结构与算法教程》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

上一篇:

下一篇: