android+tcp传输,提高java / android中TCP套接字的传输速度

我正在开发基于WiFi的直接文件传输应用程序。我可以看到使用TCP套接字的传输速度并不令人满意。速度通常为1毫巴/秒。每当我分析数据传输图时,我可以看到很多峰值,许多秒根本没有数据传输。我知道传输速度应该高很多(可能是20-30Mbps)

请帮我提高传送速度。

接受连接的服务器套接字是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_BUFFER_SIZE的值设置为1024*512。

我尝试了很多改变tcp缓冲区大小的值,但是没有运气。我用apache commons ioutils替换了复制流的实现。

帮帮我吧

更新:

请参阅以下传输图

最佳答案:

似乎您正在重载缓冲区,从setReceiveBufferSize() javadoc

通过调用

socket.setReceiveBufferSize(int)。但是,如果申请者愿意

允许接收窗口大于64K字节,如RFC1323所定义

然后必须在serversocket中设置建议的值

绑定到本地地址。这意味着,serversocket必须

使用无参数构造函数创建,然后setReceiveBufferSize()

必须调用,最后服务器套接字通过

调用bind()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值