提高java/android中TCP套接字的传输速度
我正在开发基于wifi的直接文件传输应用程序。我可以看出,使用TCP套接字的传输速度并不令人满意。速度通常为1Mbps。每当我分析数据传输图时,我都会看到很多尖峰,很多秒根本没有数据传输。我知道传输速度应该更高(可能是20-30Mbps) 请帮我提高传送速度。 接受连接的serversocket为提高java/android中TCP套接字的传输速度,java,android,sockets,tcp,wifi-direct,Java,Android,Sockets,Tcp,Wifi Direct,我正在开发基于wifi的直接文件传输应用程序。我可以看出,使用TCP套接字的传输速度并不令人满意。速度通常为1Mbps。每当我分析数据传输图时,我都会看到很多尖峰,很多秒根本没有数据传输。我知道传输速度应该更高(可能是20-30Mbps) 请帮我提高传送速度。 接受连接的serversocket为 private void serverTask() { Log.v(TAG, "server task"); try { serverRunni
private void serverTask() {
Log.v(TAG, "server task");
try {
serverRunning = true;
ServerSocket serverSocket = new ServerSocket(
DeviceDetailFragment.PORT);
serverSocket.setReceiveBufferSize(TCP_BUFFER_SIZE);
Socket client = serverSocket.accept();
BufferedInputStream inputstream = new BufferedInputStream(
client.getInputStream());
// new BufferedInputStream(client.getInputStream(), 8 * 1024);
BufferedReader bufferedStream = new BufferedReader(
new InputStreamReader(inputstream));
fileName = bufferedStream.readLine();
fileSizeInBytes = bufferedStream.readLine();
fileMime = bufferedStream.readLine();
f = new File(Globals.fileSavingLocation + fileName);
File dirs = new File(f.getParent());
if (!dirs.exists())
dirs.mkdirs();
if (f.exists()) {
f.delete();
}
f.createNewFile();
IOUtils.copy(inputstream, new FileOutputStream(f));
serverSocket.close();
}
isSuccessful = true;
} catch (IOException e) {
isSuccessful = false;
Log.e(TAG, e.getMessage());
}
serverRunning = false;
}
发送数据的客户端具有以下代码:
private void clientTask(Intent intent) {
String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);
String host = intent.getExtras().getString(EXTRAS_ADDRESS);
String fileName = intent.getExtras().getString(FILE_NAME);
String fileMimeType = intent.getExtras().getString(FILE_MIME_TYPE);
final long sizeInBytes = intent.getExtras().getLong(FILE_SIZE);
Socket socket = new Socket();
int port = intent.getExtras().getInt(EXTRAS_PORT);
try {
socket.setSendBufferSize(TCP_BUFFER_SIZE);
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)),
SOCKET_TIMEOUT);
BufferedOutputStream stream = new BufferedOutputStream(
socket.getOutputStream());
ContentResolver cr = FileTransferService.this
.getApplicationContext().getContentResolver();
InputStream is = null;
BufferedWriter bufferStream = new BufferedWriter(
new OutputStreamWriter(stream));
bufferStream.write(fileName);
bufferStream.newLine();
bufferStream.flush();
bufferStream.write(String.valueOf(sizeInBytes));
bufferStream.newLine();
bufferStream.flush();
bufferStream.write(fileMimeType);
bufferStream.newLine();
bufferStream.flush();
try {
is = new BufferedInputStream(cr.openInputStream(Uri
.parse(fileUri)));
} catch (FileNotFoundException e) {
isSuccessful = false;
}
IOUtils.copy(is, stream);
isSuccessful = true;
} catch (IOException e) {
Log.e(TAG, e.getMessage());
isSuccessful = false;
} finally {
if (socket != null) {
if (socket.isConnected()) {
try {
socket.close();
} catch (IOException e) {
// Give up
e.printStackTrace();
}
}
}
}
TCP\u BUFFER\u SIZE
的值设置为1024*512
我已经尝试了很多改变TCP_BUFFER_SIZE的值,但是没有成功。我用apachecommons IOUtils替换了复制流的实现。
帮帮我
更新:
请参见下面的传输图
我会尝试使用普通套接字进行简单的数据传输,而不使用文件
有一个简单的服务器,在连接时发送100 MB的空数据。让客户机尽可能快地读取数据,并报告其获得的吞吐量。在同一台机器上,您应该很容易看到超过100 MB/s的速度。一旦给出了一个很好的数字,就在android客户端上尝试它。看起来您正在从 可以通过调用 Socket.setReceiveBufferSize(int)。但是,如果应用程序希望 按照RFC1323的定义,允许接收窗口大于64K字节 然后,必须先在ServerSocket中设置建议的值,然后才能执行 绑定到本地地址。这意味着ServerSocket必须是 使用无参数构造函数创建,然后设置ReceiveBufferSize() 必须调用,最后,ServerSocket通过 调用bind()
您真的需要如此频繁地刷新缓冲区吗?缓冲的全部目的是减少系统调用/刷新的次数?谢谢您的评论。我已经清除了那些潮水。然而,这并没有帮助我,因为这只是2-3个电话。非常感谢您的精确定位。我按照您的建议更正了我的代码。现在速度是2-3Mbps,TCP_BUFFER_SIZE=1024*1024。但我相信,速度还可以快得多。我们将非常感谢您的进一步帮助。