2012-04-12 137 views
1

所以我想通過使用套接字來創建類似於syncronized的繪製程序的東西。我有一個服務器端......並且客戶端和我試圖從服務器發送inkCollection到客戶端。這適用於簡單的文本,但我似乎無法發送inkCollection.Or它會更酷,如果你能幫我發送最後一招,以便數據傳輸更快。這裏是我一直在嘗試的代碼:通過套接字發送inkcanvas筆畫

發送筆劃:

 byte[] data; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      inkcanvas.Strokes.Save(ms); 
      data = ms.ToArray(); 
     } 

     svr.SendToAll("u getting some strokes"); 
     svr.SendStrokes(data); 

svr.SendStrokes(字節[]數據):

public void SendStrokes(byte[] data) 
    { 
     for (int i = 0; i < no; i++) 
     { 
      byte[] dt = data; 
      accepted[i].Send(dt); 
     } 

      MessageBox.Show("dONE"); 
    } 

,這是對客戶方:

byte[] buffer=new byte[1024]; 
       MessageBox.Show("receiving strokes"); 
       int rec = conn.Receive(buffer, 0, buffer.Length, 0); 
       if (rec <= 0) 
        throw new SocketException(); 
       MessageBox.Show("strokes received"); 
       //Array.Resize(ref buffer, rec); 
       using (MemoryStream ms = new MemoryStream(buffer)) 
       { 
        inkcanvas.Strokes = new System.Windows.Ink.StrokeCollection(ms); 
        ms.Close(); 
       } 
       MessageBox.Show("strokes added"); 

這些完全相同的方法很好地工作字符串,但是當我嘗試用StrokeCollection中做到這一點,它fails.Nothing顯示了客戶端和我在服務器端獲得以下SocketException:現有連接被遠程主機強制關閉。

但是,如果你們有更好的方法如何做到這一點,這將是偉大的......這是我失蹤的東西?我的意思是..如果它適用於文本轉換成一個字節數組...爲什麼會這爲strokecollection工作?

謝謝!

編輯:你認爲你可以幫我拿出一些示例代碼?我似乎無法實現它;

+0

您可能不會調用'Close'方法,因爲在退出'using'語句之後將丟棄內存流 – VMAtm 2015-02-26 13:25:51

回答

2

你忘了設計或實施一個協議!你不能只通過TCP發送一串字節,並假定接收器能夠從中理解。

您有一個應用程序消息,包含您嘗試通過TCP發送的一組筆劃。但是TCP是一種字節流服務,而不是應用程序消息服務。因此,您需要某種應用程序消息協議來打包傳輸的消息並在收到時將其解包。但是你還沒有寫過任何這樣的代碼。所以你基本上期望它能夠通過魔法工作。

定義一個協議。例如,它可能會說:

畫布描邊應該由指示畫布描邊的'1'字節發送,然後是4個字節,指示網格字節順序中描邊對象中的字節數,然後是描邊數據。接收器將讀取第一個字節並確定它是一個畫布描邊對象。然後接收器將讀取接下來的四個字節來確定長度。接收器應積累該字節數(如果需要,使用多次讀取),然後處理重建的畫布筆劃對象。

不要跳過創建書面協議定義的步驟。

然後,當你有問題,請按照這個方便的故障排除指南:

  1. 是否發送者按照規範?如果沒有,請停止,發件人已損壞。

  2. 接收機是否遵循規範?如果沒有,停止,接收器壞了。

  3. 停止,規格被打破。

如果您想要簡單,您可以將數據轉換爲base64並將每條消息編碼爲一行文本。這將允許您使用ReadLine函數來準確捕獲一條消息。然後,您可以使用消息格式,如「S」(用於「筆劃」),後跟base64格式的數據。使用WriteLine函數發送文本消息後跟一個換行符。