繁体   English   中英

从Java套接字读取比Python慢

[英]Reading from JAVA socket slower than Python

我正在尝试使用TCP套接字从Python服务器读取数据。 为此,已经使用python编写了客户端,并且我应该为此编写Android代码。 我在JAVA中尝试了不同的方法,但是我发现我编写的JAVA代码中的Socket读取非常慢。

在某些情况下,我将覆盖缓冲区,因为我只关心接收的字节数而不是实际数据。

以下是Python客户端中套接字读取的代码段

        buffer_len = 0
        print str(tcp.response_len) + " start  " + str((time.time()-timeOrigin)*1000)
        while True:
            buffer_len += len(self.sock.recv(4096))
            print str(buffer_len) + " of " + str(tcp.response_len)
            if buffer_len >= tcp.response_len:
                break

以下是我在JAVA中尝试过的几件事:

            while (totalRead < RS.getResponse_len()) {
                                    //dataInputStream is of type DataInputStream
                int bytesRead = dataInputStream.read(buffer, totalRead, RS.getResponse_len() - totalRead);
                Log.d("Response", "Total read : " + totalRead + " of " + RS.getResponse_len());
                if (bytesRead < 0) {
                    throw new IOException("Data stream ended prematurely");
                }
                totalRead += bytesRead;
            }

缓冲区较小时:

                while (totalRead < RS.getResponse_len()) {
                int bytesRead = dataInputStream.read(buffer, 0, 4096);

                Log.d("Response", "Total read : " + totalRead + " of " + RS.getResponse_len());
                if (bytesRead < 0) {
                    throw new IOException("Data stream ended prematurely");
                }
                totalRead += bytesRead;
            }

我也尝试使用readFully而不是read,但是阅读仍然很慢。

然后,我尝试使用ReadableByteChannel读取数据,如下所示:

            ByteBuffer lenBuf = ByteBuffer.allocate(4096);
            //SocketChannel.open();
            ReadableByteChannel channel = Channels.newChannel(client.socket.getInputStream());
            int bytesRead = 0;
            while (totalRead < RS.getResponse_len()) {
                bytesRead = channel.read(lenBuf);
                lenBuf.clear();
                Log.d("Response", "Total read : " + totalRead + " of " + RS.getResponse_len());
                totalRead += bytesRead;
            }

但是我没有看到阅读方面的任何重大改进。

能否请您指出亩代码中的错误或建议我一些替代方法以加快阅读速度?

谢谢。

我不知道RS.getResponse_len()做什么。 我只能希望它不会循环计算长度。 但是,第二个片段中的一项改进是。 您的原始代码将分配足够的缓冲区大小以适应整个响应长度。 您可以将缓冲区大小用作Response_len()。 你会有类似的东西

byte[] buffer = new byte[RS.getResponse_len()];
int totalRead = 0;
while(totalRead<buffer.length) {
    int bytesRead = dataInputStream.read(buffer,totalRead,buffer.length-totalRead);
    if(bytesRead<0) throw new IOException("Data stream ended prematurely");

    totalRead+=bytesRead;
}

您说您将读取14MB的数据。 在这种情况下,您将需要读入较小的缓冲区并处理该缓冲区。

如果您只想阅读内容而不做任何事情。 尝试这个

byte[] buffer = new byte[10240]; // 10Kb buffer
BufferedInputStream bis = new BufferedInputStream(dataInputStream);
int totalBytesToRead = RS.getResponse_len();
while(totalBytesToRead>0) {
    int bytesRead = bis.read(buffer);
    if(bytesRead<0) throw new IOException("Data stream ended prematurely");
    totalBytesToRead -= bytesRead;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM