C#使用Stream.Read()从套接字读取

C#使用Stream.Read()从套接字读取,c#,sockets,stream,C#,Sockets,Stream,我有一个简单的.net程序集,它连接到服务器并返回打开的流以供读取和写入。重要的是应该是流而不是NetworkStream,因此我没有DataAvailable方法 现在,我想在控制台应用程序中使用这个简单的程序集与服务器通信:通过流对象发送消息和接收应答 问题是:从套接字读取时,下面的代码由于流而挂起。Read()将始终等待输入,并且永远不会返回0。 此行为如主题中所述 公共静态字节[]已就绪(流) { 字节[]缓冲区=新字节[32768]; 使用(MemoryStream ms=new Me

我有一个简单的.net程序集,它连接到服务器并返回打开的流以供读取和写入。重要的是应该是流而不是NetworkStream,因此我没有DataAvailable方法

现在,我想在控制台应用程序中使用这个简单的程序集与服务器通信:通过流对象发送消息和接收应答

问题是:从套接字读取时,下面的代码由于流而挂起。Read()将始终等待输入,并且永远不会返回0。 此行为如主题中所述

公共静态字节[]已就绪(流)
{
字节[]缓冲区=新字节[32768];
使用(MemoryStream ms=new MemoryStream())
{
while(true)
{
int read=stream.read(buffer,0,buffer.Length);

如果(请阅读,如果使用NetworkStream,您将如何执行此操作?DataAvailable返回false并不意味着某种“结束”已到达的邮件数为。请尝试创建它async@Evk好吧,至少它有助于停止等待,在那之后,人们面临着这样一个事实,他们真的需要等待消息的真正结束。我看到一个可能的解决方案是实现一种协议……这就是我的意思:如果你希望传递多条消息(不仅仅是一个然后关闭的连接)-这是it实现协议的唯一可靠方式(如先发送消息长度,然后发送消息本身)。如果使用NetworkStream,您将如何做到这一点?DataAvailable返回false并不意味着某种“结束”已到达的邮件数为。请尝试创建它async@Evk好吧,至少它有助于停止等待,在那之后,人们面临着这样一个事实,他们真的需要等待消息的真正结束。我看到一个可能的解决方案是实现一种协议……这就是我的意思:如果你希望传递多条消息(不仅仅是一个然后关闭的连接)-it实现协议的唯一可靠方式(如先发送消息长度,然后发送消息本身)。
public static byte[] ReadFully (Stream stream)
{
    byte[] buffer = new byte[32768];
    using (MemoryStream ms = new MemoryStream())
    {
        while (true)
        {
            int read = stream.Read (buffer, 0, buffer.Length);
            if (read <= 0)
                return ms.ToArray();
            ms.Write (buffer, 0, read);
        }
    }
}