2010-04-05 31 views
1

我正在研究Java中的服務器應用程序。我已經成功地通過了通信過程的握手部分,但我如何解密我的輸入流呢?這是我如何設置我的服務器:解密來自安全套接字的數據

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.HashMap; 

import javax.net.ServerSocketFactory; 
import javax.net.ssl.SSLServerSocket; 
import javax.net.ssl.SSLServerSocketFactory; 

import org.json.me.JSONException; 

import dictionary.Dictionary; 


public class Server { 

    private static int port = 1234; 

    public static void main(String[] args) throws JSONException { 

     System.setProperty("javax.net.ssl.keyStore", "src/my.keystore"); 
     System.setProperty("javax.net.ssl.keyStorePassword", "test123"); 

     System.out.println("Starting server on port: " + port); 
     HashMap<String, Game> games = new HashMap<String, Game>(); 
     final String[] enabledCipherSuites = { "SSL_RSA_WITH_RC4_128_SHA" }; 

     try{ 
      SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
      SSLServerSocket listener = (SSLServerSocket) socketFactory.createServerSocket(port); 
      listener.setEnabledCipherSuites(enabledCipherSuites); 
      Socket server; 

      Dictionary dict = new Dictionary(); 
      Game game = new Game(dict); //for testing, creates 1 global game. 
      while(true){ 
       server = listener.accept(); 
       ClientConnection conn = new ClientConnection(server, game, "User"); 
       Thread t = new Thread(conn); 
       t.start(); 
      } 
     } 
     catch(IOException e){ 
      System.out.println("Failed setting up on port: " + port); 
      e.printStackTrace(); 
     } 
    } 
} 

我用一個BufferedReader獲取數據從客戶端發送:

BufferedReader d = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

握手完成後它看起來像我越來越加密數據。我在網上做了一些研究,似乎我可能需要使用密碼,但我不確定。有任何想法嗎?

+1

您不會解密任何內容,只需從/向/從SSL套接字寫入。請參閱http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html – 2010-04-05 23:32:15

+0

感謝您的。看起來麻煩是d.ready(),由於某種原因,它從來沒有準備好。如果我把這件事全部解決了 – Ronald 2010-04-06 00:18:39

回答

0

available()始終返回0,並且ready()始終在基礎源是SSLSocket時返回false。

如果有任何有效的理由使用這些方法,很少有。剛剛閱讀。知道有或沒有任何數據可用,這並沒有什麼好處。你仍然必須閱讀,閱讀,而且你可以免費獲得封鎖,而不必編寫代碼,而不是浪費時間,因爲你睡了1000毫秒,數據在1毫秒後到達,或浪費了週期,因爲你做了相反的事情。而且,對可用()返回的內容定製緩衝區沒有任何好處:只需使用固定大小的緩衝區並將其分配到讀取循環外部,從而也可以節省GC循環。