【问题标题】:Stream was not readable is caused when use readbinary使用 readbinary 时导致流不可读
【发布时间】:2014-06-27 14:26:13
【问题描述】:

我正在尝试通过套接字发送一个值。所以我的项目客户端和服务器中有两个部分。

客户端使用此代码向服务器发送一个值:

  NetworkStream networkStream = socketForServer.GetStream();
            System.IO.BinaryWriter binaryWriter =
               new System.IO.BinaryWriter(networkStream);

            //------
            int messageSource = 0;
            int messageDesitination = 0;
            int interlockingId = 0;
            int trackId = 0;
            int trainId = 2;
            int direction = 0;
            int messageType = 0;
            int informationType = 0;
            int dateTime = 0;

foreach (Sensor LeftSensorList in LeftSensor)
                {

                    binaryWriter.Write(messageSource);
                    binaryWriter.Write(messageDesitination);
                    binaryWriter.Write(interlockingId);
                    binaryWriter.Write(trackId);
                    binaryWriter.Write(trainId);
                    binaryWriter.Write(direction);
                    binaryWriter.Write(messageType);
                    binaryWriter.Write(informationType);
                    binaryWriter.Write(dateTime);

                    binaryWriter.Flush();
                    binaryWriter.Close();
                    Thread.Sleep(4000);

                }

在服务器部分我应该读取二进制值:

static void Listeners()
        {

            Socket socketForClient = tcpListener.AcceptSocket();
            if (socketForClient.Connected)
            {

                NetworkStream networkStream = new NetworkStream(socketForClient);

                while (true)
                {                                
                    List<int> variables = new List<int>();
                    using (var reader = new BinaryReader(networkStream))
                    {

                        int messageSource = reader.ReadInt32();
                        int messageDesitination = reader.ReadInt32();
                        int interlockingId = reader.ReadInt32();
                        int trackId = reader.ReadInt32();
                        int trainId = reader.ReadInt32();
                        int direction = reader.ReadInt32();
                        int messageType =reader.ReadInt32();
                        int informationType = reader.ReadInt32();
                        int dateTime = reader.ReadInt32();
                         reader.Close();

                    }
            }
         }

因此,当客户端发送一个值时,我可以第一次在服务器部分获取该值,当客户端向我的服务器发送另一个值时,我收到此错误:

Stream was not readable.

为什么?

【问题讨论】:

    标签: c# sockets binaryreader binarywriter


    【解决方案1】:

    您正在关闭循环中的阅读器,即关闭流。最简单的解决方法是:

    • 将阅读器移动到循环之外,或者
    • 根本不使用阅读器(只是与流对话)

    但是,如果您需要在循环内使用阅读器,您可以使用new BinaryReader(Stream, Encoding, bool) 构造函数重载并在最后一个参数中传递true 来告诉它不要关闭底层@ 987654323@。默认情况下,假定读者将对Stream 的生命周期负责; leaveOpen 参数改变了这种行为。

    【讨论】:

    • 哎呀,好像你打败了我。
    • 谢谢,但是你能给我一个第二种方法的例子吗,因为我应该在我的循环中使用 binaryreader
    • 但我现在收到此错误:无法读取超出流的末尾。当我使用 using (var reader = new BinaryReader(networkStream, Encoding.Default, true))
    【解决方案2】:

    这是因为 BinaryReader 假定它拥有流并在使用它时关闭它。如果您使用的是 4.5,则可以使用此重载 http://msdn.microsoft.com/en-us/library/gg712804(v=vs.110).aspx

    对你来说应该是这样的。

    static void Listeners()
    {
    
        Socket socketForClient = tcpListener.AcceptSocket();
        if (socketForClient.Connected)
        {
            NetworkStream networkStream = new NetworkStream(socketForClient);
            while (true)
            {                                
                List<int> variables = new List<int>();
    
                //Hint : This Line
                using (var reader = new BinaryReader(networkStream, Encoding.Default, true))
                {
                    int messageSource = reader.ReadInt32();
                    int messageDesitination = reader.ReadInt32();
                    int interlockingId = reader.ReadInt32();
                    int trackId = reader.ReadInt32();
                    int trainId = reader.ReadInt32();
                    int direction = reader.ReadInt32();
                    int messageType =reader.ReadInt32();
                    int informationType = reader.ReadInt32();
                    int dateTime = reader.ReadInt32();
                    reader.Close();
                }
            }   
        }
    }
    

    【讨论】:

    • 但我现在收到此错误:无法读取超出流的末尾。当我使用 using (var reader = new BinaryReader(networkStream, Encoding.Default, true))
    • @EA 我认为这是一个完全不同的问题;但是,我相信这个问题会对您有所帮助stackoverflow.com/questions/3752968/…
    • 是的,你知道我从客户端收到的消息大小是 18 字节,有帮助吗?
    • @EA 如果我是你,我会把二进制阅读器放在循环之外。然后我会使用 reader.peekchar() 如果它返回 -1 然后我会终止循环。
    • @EA 我觉得你再问一个问题更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多