【问题标题】:Unable to read beyond the end of the stream is caused when use readbinary使用 readbinary 时导致无法读取超出流的末尾
【发布时间】:2014-06-27 15:07:32
【问题描述】:

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

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

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)
            {
                Console.WriteLine("Client:" + socketForClient.RemoteEndPoint + " now connected to server.");
                NetworkStream networkStream = new NetworkStream(socketForClient);


                while (true)
                {

                    TimeTableRepository objTimeTableRepository = new TimeTableRepository();
                    SensorRepository objSensorRepository = new SensorRepository();
                    ArrivalTimeRepository objArrivalTimeRepository=new ArrivalTimeRepository();
                    TrainRepository objTrainRepository = new TrainRepository();




                    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();


                    }


                }

                networkStream.Close();



            }
            socketForClient.Close();
            Console.WriteLine("Press any key to exit from server program");
            Console.ReadKey();
        }

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

无法读取超出流末尾的内容

为什么?

【问题讨论】:

    标签: c# sockets binaryreader binarywriter


    【解决方案1】:

    我会重写侦听器方法,使其看起来像这样。 注意:这是未经测试的代码。

    static void Listeners()
        {
    
            Socket socketForClient = tcpListener.AcceptSocket();
            if (socketForClient.Connected)
            {
                using (var reader = new BinaryReader(new NetworkStream(socketForClient), Encoding.Default, true))
                {
                    while (((int)reader.PeekChar()) != -1)
                    {                                 
                        List<int> variables = new List<int>();
    
                        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();
                     }
                }
         }
    

    编辑: 经过仔细检查,我注意到了一些事情。试试这个:

    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();
    
        Thread.Sleep(4000);
    }
    //Hint : Changes here
    binaryWriter.Close();
    

    【讨论】:

    • 我更改了它,但是当我的客户端尝试连接到服务器时,服务器无法显示此错误:按任意键退出服务器程序---请查看更新,我更新帖子,我写了整个监听器方法
    • 根据我所看到的,似乎问题在于您使用的机制很差。你应该重新设计并看看这个msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx
    • 所以我在我的应用程序中使用了一个线程,所以这两种方法有什么不同,我的意思是我的方法和 msdn 方法
    • @EA 是的;但是,我希望您在这样做之前尝试我的编辑,因为我认为它会更简单。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2016-05-31
    相关资源
    最近更新 更多