.Net SslStream写入/读取问题



当我读一个.Net SSLStream时,我似乎无法一口气读完所有内容。read方法总是只获取第一个字节。无论数据或缓冲区大小如何,我都需要循环来获得剩余的数据。

示例:

客户端

var message = new byte[]{1,2,3,4,5};
   sslStream.Write(messsage);
   sslStream.Flush();

服务器

byte[] buffer = new byte[4000];
bytes = sslStream.Read(buffer, 0, buffer.Length);

我做错什么了吗?为什么它在第一次读取时只读取一个字节?

流式处理API不承诺每次读取返回特定数量的字节。您可以读取从1开始的任意数量的字节。您的代码必须能够按字节接收数据,即使您要求更大的块,即使您发送了更大的组块。

最好的解决办法是不使用套接字。使用更高级别的API,如WCF、SignalR、HTTP。。。

如果您坚持您可能应该使用BinaryReader/Writer来发送您的数据。这就很容易了。

如果您不想要这些,则需要循环读取,直到收到所需的字节数为止

@usr对流读取的实现方式是完全正确的,而且你什么都不期望。另一方面,我的遭遇和@Bubba的遭遇一样。代码曾经有效,但现在无效。原因Microsoft.net framework更新。更多详细信息请点击此处:https://connect.microsoft.com/VisualStudio/feedback/details/2590316/windows-10-update-kb3147458-changes-behavior-of-sslstream-read-beginread-endread

我遇到了同样的问题。该代码几周前还在工作,现在不工作了。我想知道微软的一个更新是否破坏了它?

我创建了一个解决方案(破解)-直到我能弄清楚问题是什么:(在班级级别)

string previousChar = null;

(在TcpClient.GetStream.Begin的回调函数中)

        if ((previousChar == null) && (bytesRead == 1))
        {
            previousChar = Encoding.ASCII.GetString(readBuffer, 0, bytesRead);
        }
        // Convert the byte array the message was saved into
        if (bytesRead > 6)
        {
            message = Encoding.ASCII.GetString(readBuffer, 0, bytesRead);
            if (previousChar != null)
            {
                message = previousChar + message;
                previousChar = null;
            }

相关内容

  • 没有找到相关文章

最新更新