2012-01-19 21 views
0

我送位圖圖像中的形式JPEG * 通過UDP套接字 * .The問題是有每次圖像的可變大小進行編碼。 集裝箱圖像數據包其由與分組標識信息多個或單個圖像。圖片不發送通過UDP由於較少緩衝器大小C#

服務器端

MemoryStream Ms = new MemoryStream(); 
bformatter.Serialize(Ms, container); 
byte[] TestingFlow = Ms.GetBuffer(); 
ServerSocket.SendTo(TestingFlow, 54000, 
        SocketFlags.None, RemoteEndpoint); 

客戶端

byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint); 
ImageStream = new MemoryStream(Recievedbytes, 0, Recievedbytes.Length); 
imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream); 
+2

請注意,您或許應該使用'ToArray'而不是'的GetBuffer()',*或*使用'Ms.Length'當您發送 - 否則你可能會發送不必要零的負載。 –

+0

我應該使用ServerSocket.SendTo(Ms.Buffer(),Ms.Length,SocketFlags.None,RemoteEndPoint); ???? – Samie

+0

你可以,是的。另一方面,如果你使用UDP,你需要小心大尺寸。你真的想要自己做任何chunking等嗎? –

回答

2

我敢肯定你在服務器端使用

ServerSocket.SendTo(TestingFlow,TestingFlow.Length, 
        SocketFlags.None, RemoteEndpoint); 

+0

數組的大小是非常大於100KB以上..我要怎麼做呢? – Samie

+0

@Samie:第一次運行代碼(服務器端)時會發生錯誤嗎?你(IMO)應該發送你的文件在小塊中,直到你得到完整的大小... – Marco

+0

@Macro:其實機制以前在TCP上。在TCP時,當我得到的圖像包我只是序列化它在** NetworkStream **使用**二進制格式化程序**,在客戶端,我只是打電話給TCP。GetStream獲取NS並反序列化以獲取圖像。在這種情況下不存在問題。現在,我無法將圖像數據包分割出來,因爲我必須在客戶端上渲染它。如果可能出現碎片!!請您告訴我它是如何做到的? – Samie

0

用於發送圖像文件的UDP?沒門。

如果你是在數據完整性之後,那就把它忘掉。 TCP是更好的協議。

UDP是發送小的數據包,其中速度是問題,而不是數據的完整性,因此它在網絡遊戲中使用。數據報可能無序到達,被複制或完全消失。 UDP沒有內在的錯誤檢查或更正。如果需要,這留給應用程序。因此它的速度超過可靠性。

除非你希望寫所有的錯誤與重發請求和數據包處理檢查(確保你建立你的文件按照正確的順序備份),那麼只需要使用TCP通過套接字。

至少與TCP可以拆分圖像到可管理的塊,送他們,在安全知識,他們會以正確的順序和完整的到達。

+0

我使用UDP進行快速通信。由於通信開銷導致的小抖動可以忽略不計。主要關心的是速度,這就是爲什麼我正在將基於TCP的通信機制轉換爲UDP – Samie

+0

我建議您增加jpeg壓縮,然後將圖像尺寸縮小。 – ChrisBD

+0

我已經使用Deflation Stream算法對它進行了壓縮,但大小無法顯着降低 – Samie