Java套接字-丢失的字节和100%的处理器功耗



我正在制作一个简单的套接字应用程序,通过TCP与我的服务器连接。有时我需要读取2字节的值,所以它都像:

public byte[] read(int bytes)
{
    byte b[] = new byte[bytes];
    try {
        in.read(b); //in is InputStream from properly connected Socket.getInputStream()
    return b;
    } catch (IOException e) {
        return null;
    }
}

此函数应接收给定数量的字节,并以数组形式返回。问题是,有时它在rest可用之前读取一个字节,并返回奇怪的数据。

byte a[]=read(2); //Program is blocked here untill some bytes arrive...
System.out.prntln(a[0]); //always correct
System.out.prntln(a[1]); //unprintable character (probably 0 or -1)

我的快速解决方案是在循环检查是否有足够的数据可供读取时添加:

public byte[] read(int bytes)
{
    byte b[] = new byte[bytes];
    try {
        while (in.available()<bytes); //It does the thing
        in.read(b);
    return b;
    } catch (IOException e) {
        return null;
    }
}

但这个循环使用了100%的处理器功率(实际上是一个核心),这非常令人讨厌。有没有任何方法可以重写该函数(param和返回值必须完全相同),使其正常工作?

提前Thanx:)

是。你的权宜之计是个坏主意。事实上,任何使用available的代码都可能已损坏。

我会这样做:

public byte[] read(int bytes) throws IOException {
    byte b[] = new byte[bytes];
    int pos = 0;
    while (pos < b.length) {
       int nosRead = in.read(b, pos, b.length - pos);
       if (nosRead == -1) {
          return null;  // Not the best idea ... see below.
       } else {
          pos += nosRead;
       }
    }
    return b;
}

不需要使用available()对流进行"轮询"。没有必要睡觉。您只需要利用这样一个事实,即read只有在读取了至少一个字节或符合"流的末尾"时才会返回。


请注意,如果read方法失败,我也不认为返回null是正确的。最好抛出一个例外。。。或者让来自CCD_ 7呼叫的CCD_。

这也适用于我的重写。。。我不想改变你的代码在这方面的行为。

扔掉它,使用DataInputStream.readFully().

相关内容

  • 没有找到相关文章

最新更新