使用.net c#中的ssl流从Tcp.Client.Socket发送数据

本文关键字:Socket Client 数据 Tcp 流从 net 中的 ssl 使用 | 更新日期: 2023-09-27 18:24:27

我尝试读取一个xml文件,并使用sslStream发送到服务器。在发送到服务器之前,我必须登录,在成功授权之后,我必须发送文件数据。To文件大小约为300kb。我可以让sycessfull登录,但问题是服务器似乎没有接收到我发送的数据。以下是代码方法1:我成功登录(我收到了ok,但似乎无法发送xml文件的内容)

TcpClient sendClient = new TcpClient(serverName, port);
        SslStream sendStream = new SslStream(sendClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
        sendStream.AuthenticateAsClient(serverName, null, SslProtocols.Ssl2, true);
        sendStream.Write(Encoding.UTF8.GetBytes("Login'r'n" + username + "'r'n" + password + "'r'n"));
        sendStream.Flush();
        int bytes = -1;
        byte[] buffer = new byte[2048];
        bytes = sendStream.Read(buffer, 0, buffer.Length);
        string response = Encoding.UTF8.GetString(buffer, 0, bytes);
        if (response.Trim() == "OK")
        {
            MessageBox.Show("Connected");
            byte[] b1 = File.ReadAllBytes(filePath);
            sendStream.Write(Encoding.UTF8.GetBytes("Send'r'n"));
            sendStream.Write(Encoding.UTF8.GetBytes(fileName+"'r'n"));
            sendStream.Write(b1, 0, b1.Length);
            sendStream.Flush();
            sendStream.Write(Encoding.UTF8.GetBytes("Quit'r'n"));
            sendStream.Flush();
            sendClient.Close();
        }

这里是streamWriter 的第二种方法

TcpClient sendClient = new TcpClient(serverName, port);
        SslStream sendStream = new SslStream(sendClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
        sendStream.AuthenticateAsClient(serverName, null, SslProtocols.Ssl2, true);
        StreamWriter writer = new StreamWriter(sendStream);
        writer.WriteLine("Login");
        writer.WriteLine(username);
        writer.WriteLine(password);
        writer.Flush();
        StreamReader reader = new StreamReader(sendStream);
        string response = reader.ReadLine();
        if (response.Trim() == "OK")
        {
            MessageBox.Show("succesfull connect");
            string allText = File.ReadAllText(filePath,Encoding.Default);
            writer.WriteLine("Send");
            writer.WriteLine(fileName);
            writer.WriteLine(allText);
            sendClient.Close();
        }

使用.net c#中的ssl流从Tcp.Client.Socket发送数据

好的,一种解决方案是将所有命令写为字节数组,并将它们复制到更大的数组中。诀窍是将dataSize添加为双端数字

不要怀疑你的问题的答案是这个代码

public System.Net.Security.SslStream GetStream(NetworkStream _NetworkStream)
        {
            try
            {
                System.Net.Security.SslStream sslStream = new System.Net.Security.SslStream(_NetworkStream, false);
                sslStream.AuthenticateAsServer(serverCertificate, clientCertificateRequired: false,
                enabledSslProtocols:
                    System.Security.Authentication.SslProtocols.Default |
                    System.Security.Authentication.SslProtocols.None |
                    System.Security.Authentication.SslProtocols.Tls |
                    System.Security.Authentication.SslProtocols.Tls11 |
                    System.Security.Authentication.SslProtocols.Tls12 |
                    System.Security.Authentication.SslProtocols.Ssl2 |
                    System.Security.Authentication.SslProtocols.Ssl3
                , checkCertificateRevocation: true);
                new SSL().DisplaySecurityLevel(sslStream);
                new SSL().DisplaySecurityServices(sslStream);
                new SSL().DisplayCertificateInformation(sslStream);
                new SSL().DisplayStreamProperties(sslStream);
                sslStream.ReadTimeout = 5000;
                sslStream.WriteTimeout = 5000;
                return sslStream;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
            
        }
public string ReadMessage(System.Net.Security.SslStream sslStream)
        {
            // Read the  message sent by the client.
            // The client signals the end of the message using the
            // "<EOF>" marker.
            byte[] buffer = new byte[2048];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            //do
            //{
            // Read the client's test message.
            bytes = sslStream.Read(buffer, 0, buffer.Length);
            // Use Decoder class to convert from bytes to UTF8
            // in case a character spans two buffers.
            Decoder decoder = Encoding.UTF8.GetDecoder();
            char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
            decoder.GetChars(buffer, 0, bytes, chars, 0);
            messageData.Append(chars);
            // Check for EOF or an empty message.
            if (messageData.ToString().IndexOf("<EOF>") != -1)
            {
                //break;
            }
            //} while (bytes != 0);
            return messageData.ToString();
        }
        public void DisplaySecurityLevel(System.Net.Security.SslStream stream)
        {
            Console.WriteLine("Cipher: {0} strength {1}", stream.CipherAlgorithm, stream.CipherStrength);
            Console.WriteLine("Hash: {0} strength {1}", stream.HashAlgorithm, stream.HashStrength);
            Console.WriteLine("Key exchange: {0} strength {1}", stream.KeyExchangeAlgorithm, stream.KeyExchangeStrength);
            Console.WriteLine("Protocol: {0}", stream.SslProtocol);
        }
        public void DisplaySecurityServices(System.Net.Security.SslStream stream)
        {
            Console.WriteLine("Is authenticated: {0} as server? {1}", stream.IsAuthenticated, stream.IsServer);
            Console.WriteLine("IsSigned: {0}", stream.IsSigned);
            Console.WriteLine("Is Encrypted: {0}", stream.IsEncrypted);
        }
        public void DisplayStreamProperties(System.Net.Security.SslStream stream)
        {
            Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite);
            Console.WriteLine("Can timeout: {0}", stream.CanTimeout);
        }
        public void DisplayCertificateInformation(System.Net.Security.SslStream stream)
        {
            Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus);
            System.Security.Cryptography.X509Certificates.X509Certificate localCertificate = stream.LocalCertificate;
            if (stream.LocalCertificate != null)
            {
                Console.WriteLine("Local cert was issued to {0} and is valid from {1} until {2}.",
                    localCertificate.Subject,
                    localCertificate.GetEffectiveDateString(),
                    localCertificate.GetExpirationDateString());
            }
            else
            {
                Console.WriteLine("Local certificate is null.");
            }
            // Display the properties of the client's certificate.
            System.Security.Cryptography.X509Certificates.X509Certificate remoteCertificate = stream.RemoteCertificate;
            if (stream.RemoteCertificate != null)
            {
                Console.WriteLine("Remote cert was issued to {0} and is valid from {1} until {2}.",
                    remoteCertificate.Subject,
                    remoteCertificate.GetEffectiveDateString(),
                    remoteCertificate.GetExpirationDateString());
            }
            else
            {
                Console.WriteLine("Remote certificate is null.");
            }
        }