2014-01-29 34 views
0

試圖編寫Java服務器< -SSL Socket-> C#客戶端。面對從流中正確讀寫Java數據是不可能的問題。只能手動。有什麼方法可以改善閱讀和寫作嗎?Java SSL Socket服務器不正確InputStream

的Java

public static void main(String[] args) throws Exception { 
    System.out.println("Opening server socket..."); 
    System.out.println(System.currentTimeMillis()); 
    char[] passphrase = "password".toCharArray(); 
    System.out.println"---------------------"); 
    System.out.println(java.security.KeyStore.getDefaultType()); 
    try 
    { 
     KeyStore keystore1 = KeyStore.getInstance("jks"); 
     FileInputStream fis = new FileInputStream("mykeystore.jks"); 
     keystore1.load(fis, passphrase); 
     fis.close(); 
     KeyStore ksTrust = KeyStore.getInstance("jks"); 
     FileInputStream fis2 = new FileInputStream("mykeystore.jks"); 
     ksTrust.load(fis2, passphrase); 
     KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
     kmf.init(keystore1, passphrase); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
     tmf.init(ksTrust); 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

     SSLServerSocketFactory ssf = 
     (SSLServerSocketFactory) sslContext.getServerSocketFactory(); 
     SSLServerSocket ss = 
     (SSLServerSocket) ssf.createServerSocket(PORT_WORK); 

     while (true) { 
      SSLSocket s = (SSLSocket) ss.accept(); 
      s.startHandshake(); 
      s.setTcpNoDelay(true); 

      byte[]b = new byte[2048]; 
      s.getInputStream().read(b); 
      System.out.println(new String(b).trim()); 

      s.getOutputStream().write("Test".getBytes("UTF-8")); 

      b = new byte[2048]; 
      s.getInputStream().read(b); 
      System.out.println(new String(b).trim()); 

      s.close(); 
      System.out.println("-------||END||-------"); 
     } 
    } catch (Exception e) { 
     System.out.println("Cannot open\r\n" + e); 
    } 
} 

C#

public static bool ValidateServerCertificate(
object sender, 
X509Certificate certificate, 
X509Chain chain, 
SslPolicyErrors sslPolicyErrors) 
{ 
    if (sslPolicyErrors != SslPolicyErrors.None) 
    Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 
    return true; 
}  

static void Main(string[] args) 
{ 
    TcpClient client = new TcpClient() { SendTimeout = 1000, ReceiveTimeout = 1000 }; 
    IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4446); 

    client.Connect(serverEndPoint); 
    client.NoDelay = true; 
    Console.WriteLine("Client connected."); 

    SslStream sslStream = new SslStream(client.GetStream(), 
false,ValidateServerCertificate, null); 
    try 
    { 
     sslStream.AuthenticateAsClient("Test"); 
     try 
     { 
      Console.WriteLine("---------------------"); 
      char[] c = new char[2048]; 
      StreamReader sr = new StreamReader(sslStream); 
      StreamWriter sw = new StreamWriter(sslStream); 
      sw.WriteLine("Hardly one"); sw.Flush(); 
      Console.WriteLine(new string(c, 0, sr.Read(c, 0, c.Length))); 
      sw.WriteLine("Simple two"); sw.Flush(); 
     } 
     catch (Exception e){Console.WriteLine(e.Message);} 
    } 
    catch (Exception error) 
    { 
     Console.WriteLine("Exception: {0}", error.Message); 
     if (error.InnerException != null) 
     { 
      Console.WriteLine("Inner exception: {0}", error.InnerException.Message); 
     } 
     Console.WriteLine("Authentication failed - closing the connection."); 
    }                   
    client.Close(); 
    Console.WriteLine("---------------------"); 
    Console.WriteLine("Client disconnected."); 
    Console.ReadKey(); 
} 

回答

0

我不知道你說「不可能」或「手動」的意思,但在任何語言從TCP套接字讀取時,它是必不可少的注意讀取API返回的計數。你不能認爲它填滿了緩衝區。它只需要讀取一個或多個字節。