我从VNC服务器接收字节数据,使用Real VNC,这在我的方法/功能中有效:
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];
}
我很快就偶然发现它,因为当我使用断点时,原始代码在Tight VNC中正常运行,而不会仅仅收到前两个字节。我的套接字是阻塞的,接收大小为1024.然而,我在本地运行服务器和客户端,因为我没有其他测试方法。
问题是:
除了使用带有“aByte”的额外字节的内存并迭代X字节。是否有很多处理差异,而不是直接使用Socket.Receive接收它?请记住,我可能会在某些时候获得MB数据。
此外,这将在Blackberry上作为Java应用程序实现,同样的方法是否会在Java Mobile中具有明显的处理意义?
欢呼,克雷格答案 0 :(得分: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);
}
这样你就不会太快返回,但你也不会逐字节地读取数据。