使用LocalServerSocket时"IOException:再试一次"

Gra*_*eme 5 android localserversocket localsocket

有没有人有关于例外"再试一次"的更多有用信息?

我正在使用LocalServerSocket和发送应用程序之间的位图LocalSocket:

输出:

socket = new LocalSocket();
socket.connect(new LocalSocketAddress(SOCKET_NAME));
fos = new DataOutputStream(socket.getOutputStream());
...

public void onEvent() {
    fos.writeInt(width);
    fos.writeInt(height);
    fos.writeInt(newBuffer.length);
    fos.write(newBuffer);
}
Run Code Online (Sandbox Code Playgroud)

输入:

server = new LocalServerSocket(SOCKET_NAME);
socket = server.accept(); 
socket.setSoTimeout(60);

while(true) {

    int width = fis.readInt(); // IO Exception being thrown here
    int height = fis.readInt(); 
    int length = fis.readInt();
    byte[] bytes = new byte[length];
    fis.read(bytes);
}
Run Code Online (Sandbox Code Playgroud)

[为了清晰起见,删除了try/catch等]

04-18 09:19:11.664: W/System.err(1268): java.io.IOException: Try again
04-18 09:19:11.664: W/System.err(1268):     at android.net.LocalSocketImpl.readba_native(Native Method)
04-18 09:19:11.664: W/System.err(1268):     at android.net.LocalSocketImpl.access$400(LocalSocketImpl.java:29)
04-18 09:19:11.664: W/System.err(1268):     at android.net.LocalSocketImpl$SocketInputStream.read(LocalSocketImpl.java:92)
04-18 09:19:11.664: W/System.err(1268):     at libcore.io.Streams.readFully(Streams.java:81)
04-18 09:19:11.664: W/System.err(1268):     at java.io.DataInputStream.readInt(DataInputStream.java:124)
04-18 09:19:11.664: W/System.err(1268):     at com.test.util.BitmapSendingUtils$BitmapReceiver$1.run(BitmapSendingUtils.java:105)
Run Code Online (Sandbox Code Playgroud)

Gra*_*eme 3

因为我找不到解决方案,所以我重新设计了这个。但是,在以不同的方式实现它时,我在原始代码中遇到了这些错误:

byte[] bytes = new byte[length];
fis.read(bytes);
Run Code Online (Sandbox Code Playgroud)

应该:

byte[] content = new byte[length];
int read = is.read(content);
while(read < content.length) {
    read += is.read(content, read, content.length - read);
}
Run Code Online (Sandbox Code Playgroud)

因为它.read(byte[])不会一下子就把所有东西都吞掉。我认为它在这样做时会不断地发出声音并阻塞。

还有这样的:

socket.setSoTimeout(60);
Run Code Online (Sandbox Code Playgroud)

arg 以毫秒为单位而不是秒,因此应该是:

socket.setSoTimeout(60 * 1000);
Run Code Online (Sandbox Code Playgroud)

我仍然不知道上述错误命名的异常的原因,所以希望有人知道的话仍然会回答这个问题!