2011-11-01 58 views
3

我從VNC服務器接收字節的數據,使用Real VNC這部作品在我的方法/功能:C#和Java的套接字和字節數據讀取開銷

byte[] readBytes = new byte[count]; 
sock.Receive(readBytes); 

使用TigerVNC它不起作用,但這樣做:

byte[] readBytes = new byte[count];  

byte[] aByte = new byte[1]; 

for (int i = 0; i < count; i++) 
{ 
    sock.Receive(aByte);  
    readBytes[i] = aByte[0]; 
}        

我在無意中發現它很快,因爲當我用斷點的原代碼進來好嗎從緊VNC,沒有接收到前兩個字節只有打破。我的套接字被阻塞,並且接收大小爲1024.但是,我在本地運行服務器和客戶端,因爲我沒有其他測試方式。

的問題是:

比使用的內存的額外的字節以「aByte」,並通過X字節迭代

其他。與使用Socket.Receive直接接收它有什麼不同?考慮到我可能會在某個時候獲得MB的數據。

此外,這將在黑莓手機上作爲Java應用程序實現,這種方法是否會影響Java Mobile中的處理?

乾杯,克雷格

+2

你是什麼意思,在TigerVNC它「不起作用」? –

+0

沒有中斷(在調試中)只有從Tight VNC收到前兩個字節。現在回答的問題是,我沒有給套接字時間來接收數據。 –

回答

4

這些方法都不是特別好。你想要做的就是繼續調用Recv,直到它讀取你想要的所有字節或者返回一個錯誤。每一次,傳遞一個指針到目前爲止你收到的字節和剩餘的字節數之後。

看看這個頁面上的Socket.Receive方法。關鍵是這個(簡化):

public static void Receive(Socket socket, byte[] buffer, int size) 
{ 
int received = 0; 
do 
{ 
    try 
    { 
    received += socket.Receive(buffer, received, size - received, SocketFlags.None); 
    } 
    catch (SocketException ex) 
    { 
    throw ex; // any serious error occurr 
    } 
} while (received < size); 
} 

這樣你不會太快返回,但你並不讀取數據逐字節。

+0

是的,你是對的。謝謝。出於興趣,任何想法爲什麼RealVNC使用我的代碼但TightVNC沒有?只是他們如何編程? –

+0

有可能一臺VNC服務器碰巧發送了所有的數據,以致它一下子就收到了,而另一臺卻沒有。無論哪種方式,這只是運氣。 –

+0

我很高興我現在問了這個問題,自從我使用套接字以來,我一直在做我的頭頂。很幸運,這可能會阻礙我好幾天!再次感謝。 –