2011-11-01 57 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

我很高兴我现在问了这个问题,自从我使用套接字以来,我一直在做我的头顶。很幸运,这可能会阻碍我好几天!再次感谢。 –