从Java套接字读取比Python慢

拉杰什·戈兰尼(Rajesh Golani)

我正在尝试使用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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Matlab从Python套接字读取

来自分类Dev

读取SSL套接字Java的奇怪行为

来自分类Dev

从线程中的Java TCP套接字读取

来自分类Dev

Java 套接字读取后立即写入

来自分类Dev

Java套接字多次写入和读取

来自分类Dev

使用套接字 Python 从网站读取文本

来自分类Dev

从C读取套接字

来自分类Dev

从套接字读取数据

来自分类Dev

从C读取套接字

来自分类Dev

从套接字读取问题

来自分类Dev

从客户端套接字读取数据似乎缺少字节(从 java 到 python)

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

Java、HTTP 和套接字:何时停止读取请求但保持套接字打开?

来自分类Dev

从Java套接字读取的正确方法是什么?

来自分类Dev

如何使用线程JAVA从套接字读取输入

来自分类Dev

如何使用Java中的套接字快速读取数据?

来自分类Dev

使用null检查Java从套接字读取HTTP请求

来自分类Dev

从Docker Java回调期间套接字读取中断

来自分类Dev

Java套接字从C#读取字节

来自分类Dev

当套接字在Java中读取输入时,while循环失败

来自分类Dev

TCP 套接字通信 Java - Python

来自分类Dev

如何在Python中从套接字读取原始字节?

来自分类Dev

从Python中的套接字读取内容时解码内容

来自分类Dev

Python:套接字未读取字节输入

来自分类Dev

在Python中向后读取URL套接字

来自分类Dev

在Linux中在套接字上选择慢

来自分类Dev

为什么套接字实现比请求慢?

来自分类Dev

从Linux套接字读取“ varint”