2010-04-05 33 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循环。