如何从tcp socket快速接收一个包快速java

时间:2016-08-24 17:16:24

标签: java android sockets tcp inputstream

远程Tcp服务器设备一次发送8个字节的数据,并且以相对快的速度发送(但速度不是很快)。无论如何,我想收到8个字节,并在给定的8个字节上执行。但是,我似乎正在接收带有这8个字节的多个字节的字节数,这些字节数重复到我的计数(代码中)是8个字节的几倍,长度从16到120多字节不等。

检查Wireshark,远程Tcp服务器似乎正在发送8个字节而不是组合它们。这告诉我,套接字的读取速度太慢,因此我可以将8字节间隔背靠背组合,这是我不想要的。一个例子是:

8个字节-8个字节-16字节-8个字节-8个字节-56bytes。

这里是一个时间戳,表示数据流的速度,只需10毫秒。

(13:44:23.210) 00h 10h 01h 06h FFh 3Ah FFh FFh
(13:44:23.290) 00h 10h 01h 06h FFh 3Fh FFh FFh
(13:44:23.300) 00h 10h 01h 06h FFh 44h FFh FFh

如何确保尽可能快地从端口读取数据,同时确保没有8字节数据的倍数?

以下代码是一个读取未知大小数据的段,并将其发回NetworkManager进行进一步处理。我曾尝试使用不同的流来获得所需的效果,但两种流都不能确保这一点。

    private class Receive extends Thread {

        private InputStream inputStream;
        private DataInputStream dataInputStream;
        private BufferedInputStream bufferedInputStream;
        private ByteArrayOutputStream byteArrayOutputStream;

        public void run() {
            if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":receive run.");
            bundle = new Bundle();
            buffer = new byte[1024];
            try {
                bufferedInputStream = new BufferedInputStream(socket.getInputStream());
            } catch (IOException ioException) {
                Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":IOException", ioException);
            }
            while (connected && !closed) {
                if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":retry read.");
                try {
//                    socket.setSoTimeout(timeout);
                    int count = bufferedInputStream.read(buffer);
                    byteArrayOutputStream = new ByteArrayOutputStream(count);
                    if (count == -1) {
                        networkManager.stopTcpNetwork(name);
                        closed = true;
                        Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + "Connection Lost?!?!");
                    } else {
                        if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":call back." + " Count: " + String.valueOf(count));
                        byteArrayOutputStream.write(buffer, 0, count);
                        bundle.putByteArray(name, byteArrayOutputStream.toByteArray());
//                        bundle.putByteArray(name, buffer);
                        message = networkManager.obtainMessage();
                        message.what = Messages.MESSAGES_TCP_DATA.getInt();
                        message.setData(bundle);
                        networkManager.sendMessage(message);
                    }
                } catch (SocketTimeoutException socketTimeoutException) {
                    if (DEBUG) Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":no data yet.");
                } catch (Exception exception) {
                    Log.d(TAG + " \"" + name + "\"", String.valueOf(getId()) + ":Exception", exception);
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:-1)

套接字只是在数据被读入缓冲区之前缓冲数据。正如其他人所指出的那样,正确的答案是从套接字中读取所有内容或仅从套接字中读取预期的字节数。

无论如何,项目的增长以及需要吸引的数据也在增长。话虽这么说,最简单的方法是将数据发送回另一个线程进行本地缓冲,然后最终循环查看潜在的消息(检查完成)并继续处理。

所以,希望这有助于其他人..如果没有,哎呀和抱歉。 感谢所有评论和帮助的人!