使用 SslStream 处理一些套接字层。参考
使用参考,我实现了一个简单的客户端。尴尬的部分是当您运行应用程序时,服务器似乎没有回复客户端。
进入调试屏幕并设置一些断点,我意识到正是这个函数处于无限循环中。
static string ReadMessage(SslStream sslStream)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
byte [] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do
{
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.
if (messageData.ToString().IndexOf("<EOF>") != -1)
{
break;
}
} while (bytes != 0);
return messageData.ToString();
}
进一步调查指出了真正的罪犯:
bytes = sslStream.Read(buffer, 0, buffer.Length);
好像,SslStream.Read()
是回不去了。检查byte[] buffer
in debug 屏幕显示响应已写入到buffer
till crlf
。该功能已经完成了它的工作,但它仍然没有成功返回?!
这可能是什么原因?我应该采取哪些步骤来忽略这个问题?
另外,对于持怀疑态度的人:我曾经openssl
查看服务器是否正常运行,并且服务器端的一切都很好。
注意:我已经知道该SslStream.ReadTimeout
属性。虽然它通过引发它来完成这项工作,exception
但这并不是每个场景的正确答案,特别是当服务器响应大量数据流时,只能使用 while 循环和缓冲区有效读取。