套接字数据接收句柄

时间:2015-03-23 10:53:54

标签: c# sockets

这是一个常见的问题我猜我发现很多帖子与此有关但无法找出解决方案。

我将一组数据按顺序发送到C#套接字服务器应用程序。现在我的数据不断从客户端传出,但我无法以特定格式分解数据并保存到文件。请参阅下面的协议方法。

客户流程

  1. 发送文件名
  2. 发送< _EON> (标记)告诉文件名已结束
  3. 循环阅读和发送文件内容
  4. 发送< _EOF> (标记)告诉文件数据结束并关闭写入文件
  5. 服务器进程

    1. 循环阅读并相应处理
    2. 使用下面的代码问题是:我无法将文件名的数据切割成一个字符串,因为大小为1024字节的数据全部被收到。我想我需要实现一些队列或其他数据结构来存储接收到的缓冲区并相应地进行处理。但我不知道该怎么做。

      服务器代码

      public void DataReadThread()
      {
        int size = 0;
        byte[] byteBuffer = new byte[1024];    
      
        while (!m_stopClient)
        {
          size = m_clientSocket.Receive(byteBuffer);
          m_currentReceiveDateTime = DateTime.Now;
          ParseReceiveBuffer(byteBuffer, size);
        }
      }
      
      private void ParseReceiveBuffer(byte[] byteBuffer, int size)
      {
        string data = Encoding.ASCII.GetString(byteBuffer, 0, size);
      
        switch (m_processState)
        {
          case STATE.FILE_NAME_READ:
            {
              m_strFileName = m_strFileName.Append(data);
              int lineEndIndex = data.IndexOf("<EON>");
              //Found <EON> - stop now and build the file name
              if (lineEndIndex != -1)
              {
                string strFileName = m_strFileName.ToString();
                strFileName = strFileName.Substring(0, strFileName.Length-5);
                strFileName = DEFAULT_FILE_STORE_LOC + strFileName;
                m_binaryFile = new BinaryWriter(File.Open(strFileName, FileMode.Create));
                m_processState = STATE.DATA_READ;
              }
            }
            break;
          case STATE.DATA_READ:
            {
              int lineEndIndex = data.IndexOf("<EOF>");
              //Found <EOF> - stop writing file now
              if (lineEndIndex != -1)
              {
                m_binaryFile.Close();
                m_binaryFile = null;
                m_processState = STATE.FILE_CLOSED;
                m_markedForDeletion = true;
              }
              else
              {
                m_binaryFile.Write(byteBuffer, 0, size);
                m_binaryFile.Flush();
              }
            }
            break;
          case STATE.FILE_CLOSED:
          default:
            break;
          }
         }
      

0 个答案:

没有答案