【问题标题】:Reading Data from Network Stream in TCP Listener在 TCP 侦听器中从网络流中读取数据
【发布时间】:2013-10-11 20:59:36
【问题描述】:

我有一个包含文件名和文件数据的网络流。我以一些块的形式发送文件,每个块都带有文件名以便于识别。您能帮我正确读取网络流并将所有数据写入文件流吗? 当我从网络流中写入数据时,我似乎错过了几个字节。 例如,文件名长度将在第 4 个索引中,文件名将从第 4 个索引开始。

    Client:

    int NoOfPackets = Convert.ToInt32
          (Math.Ceiling((Convert.ToDouble(Fs.Length))/ Convert.ToDouble(BufferSize)));
           int TotalLength = (NoOfPackets *4+fileNameByte.Length) +(int)Fs.Length,     CurrentPacketLength, counter = 0;
        netstream1 = client.GetStream();
          for (int i = 0; i < NoOfPackets+1 ; i++)
          {

              if (TotalLength > BufferSize)
              {
                  CurrentPacketLength = BufferSize;
                  TotalLength = TotalLength - CurrentPacketLength;
              }
              else
                  CurrentPacketLength = TotalLength;
              SendingBuffer = new byte[CurrentPacketLength];
             fileNameLength.CopyTo(SendingBuffer, 0);
              fileNameByte.CopyTo(SendingBuffer, 4);
              Fs.Read(SendingBuffer, 4 + fileNameByte.Length, CurrentPacketLength - (4 + fileNameByte.Length));
             netstream1.Write(SendingBuffer, 0, SendingBuffer.Length);
               netstream1.Flush();
                 }

监听代码:

           client = Listener.AcceptTcpClient();
                    client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
                    //client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, true);
                    client.Client.LingerState = new LingerOption(true, 300);
                    client.Client.SendTimeout = 300000;                     
                    client.Client.ReceiveTimeout = 300000;
                    client.NoDelay = true;
                    NetworkStream netstream = client.GetStream();

                    MemoryStream ms = new MemoryStream();
                    bool first = true;
                    string fullPath = "";
                    byte[] RecData = new byte[512000];

                    while ((RecBytes = netstream.Read
                        (RecData, 0, RecData.Length)) > 0)
                    {

                        int fileNameLen = RecData[0];

                        if (fileNameLen > 0 && first)
                        {
                            string name1 = "", name2 = "";
                            first = false;

                            name1 = Encoding.UTF8.GetString(RecData, 4, fileNameLen);


                            name2 = name1;

                            string folderName = "";
                            if (name2.Contains("\\"))
                            {
                                folderName = name2.Substring(0, name2.LastIndexOf("\\"));
                                if (!Directory.Exists("D:\\123\\" + folderName))
                                    Directory.CreateDirectory("D:\\123\\" + folderName);

                            }
                            if (folderName != "")
                                fullPath = "D:\\123\\" + folderName + "\\" + name2.Substring(name2.LastIndexOf("\\") + 1);
                            else
                                fullPath = "D:\\123\\" + name2.Substring(name2.LastIndexOf("\\") + 1);
                        }


                        if (!File.Exists(fullPath))
                        {

                            //file = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write);

                            while (true)
                            {
                                try
                                {
                                    using (FileStream file = new FileStream(fullPath, FileMode.OpenOrCreate, FileAccess.Write))
                                    {

                                        if (RecBytes - (4 + fileNameLen) > 0)
                                            file.Write(RecData, 4 + fileNameLen, RecBytes - (4 + fileNameLen));
                                        break;
                                    }
                                }
                                catch (IOException)
                                {

                                    Thread.Sleep(20);
                                }
                            }
                            //using (file = File.Create(fullPath))
                            //{
                            //    file.Write(data, 4 + fileNameLen, (int)data.Length - (4 + fileNameLen));
                            //}


                        }
                        else
                        {

                            while (true)
                            {
                                try
                                {
                                    using (FileStream file = new FileStream(fullPath, FileMode.Append, FileAccess.Write))
                                    {

                                        if (RecBytes - (4 + fileNameLen) > 0)
                                            file.Write(RecData, 4 + fileNameLen, RecBytes - (4 + fileNameLen));
                                        break;
                                    }
                                }
                                catch (IOException)
                                {

                                    Thread.Sleep(20);
                                }
                            }

                        }


                    }

                    ms.Close();

                    netstream.Close();
                    client.Close();

【问题讨论】:

  • 请出示您的相关代码以及您尝试过的内容。
  • 根据给定的信息是不可能找到问题的。

标签: c#


【解决方案1】:

即使您像任何人一样含糊不清,但我仍然建议您创建一个结构,以便可以以已知格式完成数据的序列化和反序列化!并且可以避免数据丢失! 同样,如果您知道您的方法,这将对回答您的问题有很大帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多