我正在尝试使用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而不是阅读,但阅读仍然很慢。
然后我尝试使用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;
}
但我没有看到任何显着的阅读改善。
你能否指出mu代码中的错误或建议我更快速阅读的其他选择?
谢谢。
答案 0 :(得分:0)
我不知道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;
}