2011-06-01 51 views
0

我一直在通過創建一個應用程序來學習C#,並且我碰到了一個難題,我真的很掙扎。c#SslStream.Read循環問題

基本上我有下面的代碼是什麼即時通訊使用從我已經設置的網絡流中讀取。它的工作原理是每次只讀取1個數據包,sslstream.Read()解鎖。這導致了大量的消息積壓。

即時看到試圖做的是,如果流讀取的部分包含多個數據包讀取它們。

我已經嘗試了多次解決它,但我只是在一大堆代碼結束了。

如果有人可以幫忙,我會很感激!

(每個分組的第一4字節是數據包的大小..分組範圍的8個字節和28000個字節之間)

 SslStream _sslStream = (SslStream)_sslconnection; 
     int bytes = -1; 
     int nextread = 0; 
     int byteslefttoread = -1; 
     byte[] tmpMessage; 
     byte[] buffer = new byte[3000000]; 
     do 
     { 
      bytes = _sslStream.Read(buffer, nextread, 8192); 
      int packetSize = BitConverter.ToInt32(buffer, 0); 
      nextread += bytes; 
      byteslefttoread = packetSize - nextread; 

      if (byteslefttoread <= 0) 
      { 
       int leftover = Math.Abs(byteslefttoread); 
       do 
       { 
        tmpMessage = new byte[packetSize]; 
        Buffer.BlockCopy(buffer, 0, tmpMessage, 0, packetSize); 

        PacketHolder tmpPacketHolder = new PacketHolder(tmpMessage, "in"); 
        lock (StaticMessageBuffers.MsglockerIn) 
        { 
         //puts message into the message queue.. not very oop... :S 
         MessageInQueue.Enqueue(tmpPacketHolder); 
        } 
       } 
       while (leftover > 0); 

       Buffer.BlockCopy(buffer, packetSize , buffer, 0, leftover); 
       byteslefttoread = 0; 
       nextread = leftover; 

      } 

     } while (bytes != 0); 

回答

0

如果使用的.Net 3.5或更高我會強烈建議你看看Windows Communication Foundation (wcf)。它只是你通過網絡嘗試做的任何事情。

另一方面,如果你這樣做純粹是爲了教育目的。 看看this link。您最好的選擇是以較小的增量從流中讀取數據,並將數據輸入另一個數據流。一旦你可以確定你需要的信息的長度,你可以將第二個信息流剪切成消息。你可以設置一個外部循環來檢查可用的字節,並等到它的值大於0時開始下一條消息。還應該注意,任何網絡代碼都應該在自己的線程上運行,以免阻塞UI線程。