c#& java套接字和字节数据读取开销

时间:2011-11-01 23:44:50

标签: c# java performance sockets bytearray

我从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中具有明显的处理意义?

欢呼,克雷格

1 个答案:

答案 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);
}

这样你就不会太快返回,但你也不会逐字节地读取数据。