【问题标题】:Java SSL Socket Server not correct InputStreamJava SSL 套接字服务器输入流不正确
【发布时间】:2014-02-21 07:39:02
【问题描述】:

尝试编写 Java 服务器 C# 客户端。面临无法从流中正确读写Java数据的问题。只能手动。有什么方法可以提高阅读和写作能力?

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();
}

【问题讨论】:

    标签: c# java sockets ssl


    【解决方案1】:

    我不知道您所说的“不可能”或“手动”是什么意思,但是当以任何语言从 TCP 套接字读取时,必须注意读取 API 返回的计数。你不能假设它填满了缓冲区。只需要读取一个或多个字节。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多