Java Socket實戰之五 使用加密協議傳輸對象

來源:互聯網
上載者:User

本文地址:http://blog.csdn.net/kongxx/article/details/7259837

Java Socket實戰之一 單線程通訊

Java Socket實戰之二 多線程通訊

Java Socket實戰之三 傳輸對象

Java Socket實戰之四 傳輸壓縮對象

前面幾篇博文提到了Socket中一些常用的用法,但是對於一些有安全要求的應用就需要加密傳輸的資料,此時就需要用到SSLSocket了。

還是一樣需要一個實現了java.io.Serializable介面的簡單Java對象

package com.googlecode.garbagecan.test.socket.ssl;</p><p>public class User implements java.io.Serializable {<br />private static final long serialVersionUID = 1L;<br />private String name;<br />private String password;</p><p>public User() {</p><p>}</p><p>public User(String name, String password) {<br />this.name = name;<br />this.password = password;<br />}</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>public String getPassword() {<br />return password;<br />}</p><p>public void setPassword(String password) {<br />this.password = password;<br />}</p><p>}SSL Server類,這裡需要用到ServerSocketFactory類來建立SSLServerSocket類執行個體,然後在通過SSLServerSocket來擷取SSLSocket執行個體,這裡考慮到物件導向中的面向介面編程的理念,所以代碼中並沒有出現SSLServerSocket和SSLSocket,而是用了他們的父類ServerSocket和Socket。在擷取到ServerSocket和Socket執行個體以後,剩下的代碼就和不使用加密方式一樣了。

package com.googlecode.garbagecan.test.socket.ssl;</p><p>import java.io.BufferedInputStream;<br />import java.io.IOException;<br />import java.io.ObjectInputStream;<br />import java.io.ObjectOutputStream;<br />import java.net.ServerSocket;<br />import java.net.Socket;<br />import java.util.logging.Level;<br />import java.util.logging.Logger;</p><p>import javax.net.ServerSocketFactory;<br />import javax.net.ssl.SSLServerSocketFactory;</p><p>public class MyServer {</p><p>private final static Logger logger = Logger.getLogger(MyServer.class.getName());</p><p>public static void main(String[] args) {<br />try {<br />ServerSocketFactory factory = SSLServerSocketFactory.getDefault();<br />ServerSocket server = factory.createServerSocket(10000);</p><p>while (true) {<br />Socket socket = server.accept();<br />invoke(socket);<br />}<br />} catch (Exception ex) {<br />ex.printStackTrace();<br />}<br />}</p><p>private static void invoke(final Socket socket) throws IOException {<br />new Thread(new Runnable() {<br />public void run() {<br />ObjectInputStream is = null;<br />ObjectOutputStream os = null;<br />try {<br />is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));<br />os = new ObjectOutputStream(socket.getOutputStream());</p><p>Object obj = is.readObject();<br />User user = (User)obj;<br />System.out.println("user: " + user.getName() + "/" + user.getPassword());</p><p>user.setName(user.getName() + "_new");<br />user.setPassword(user.getPassword() + "_new");</p><p>os.writeObject(user);<br />os.flush();<br />} catch (IOException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} catch(ClassNotFoundException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} finally {<br />try {<br />is.close();<br />} catch(Exception ex) {}<br />try {<br />os.close();<br />} catch(Exception ex) {}<br />try {<br />socket.close();<br />} catch(Exception ex) {}<br />}<br />}<br />}).start();<br />}<br />}SSL Client類和SSL Server類類似,只是將其中擷取Socket的方式有所變化,其餘的代碼也和不使用加密方式一樣。

package com.googlecode.garbagecan.test.socket.ssl;</p><p>import java.io.BufferedInputStream;<br />import java.io.IOException;<br />import java.io.ObjectInputStream;<br />import java.io.ObjectOutputStream;<br />import java.net.Socket;<br />import java.util.logging.Level;<br />import java.util.logging.Logger;</p><p>import javax.net.SocketFactory;<br />import javax.net.ssl.SSLSocketFactory;</p><p>public class MyClient {</p><p>private final static Logger logger = Logger.getLogger(MyClient.class.getName());</p><p>public static void main(String[] args) throws Exception {<br />for (int i = 0; i < 100; i++) {<br />Socket socket = null;<br />ObjectOutputStream os = null;<br />ObjectInputStream is = null;</p><p>try {<br />SocketFactory factory = SSLSocketFactory.getDefault();<br />socket = factory.createSocket("localhost", 10000);</p><p>os = new ObjectOutputStream(socket.getOutputStream());<br />User user = new User("user_" + i, "password_" + i);<br />os.writeObject(user);<br />os.flush();</p><p>is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));<br />Object obj = is.readObject();<br />if (obj != null) {<br />user = (User)obj;<br />System.out.println("user: " + user.getName() + "/" + user.getPassword());<br />}<br />} catch(IOException ex) {<br />logger.log(Level.SEVERE, null, ex);<br />} finally {<br />try {<br />is.close();<br />} catch(Exception ex) {}<br />try {<br />os.close();<br />} catch(Exception ex) {}<br />try {<br />socket.close();<br />} catch(Exception ex) {}<br />}<br />}<br />}<br />}代碼寫完了,下面就需要產生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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.