繁体   English   中英

Java SSL套接字服务器不正确的InputStream

[英]Java SSL Socket Server not correct InputStream

尝试编写Java服务器<-SSL套接字-> C#客户端。 面临无法从流中正确读写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();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM