AeroToss: оптимизация скорости передачи

- Буферы увеличены: 64KB → 256KB (отправка + приём)
- TCP_NODELAY = false (Nagle batching для высокой пропускной способности)
- Socket buffer: 1MB send/receive
- BufferedInputStream/BufferedOutputStream: 256KB
- Таймаут увеличен до 60 сек для больших файлов
This commit is contained in:
2026-08-20 12:06:46 +03:00
parent 32e4e6698e
commit f8b73312ba
2 changed files with 28 additions and 14 deletions
@@ -83,6 +83,9 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
try { socket.close() } catch (_: Exception) {} try { socket.close() } catch (_: Exception) {}
return return
} }
socket.tcpNoDelay = false
socket.sendBufferSize = 1048576
socket.receiveBufferSize = 1048576
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val progressId = UUID.randomUUID().toString() val progressId = UUID.randomUUID().toString()
var actualFile: File? = null var actualFile: File? = null
@@ -90,8 +93,8 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
try { try {
socket.use { sock -> socket.use { sock ->
sock.soTimeout = 60_000 sock.soTimeout = 60_000
val input = DataInputStream(sock.getInputStream()) val input = DataInputStream(BufferedInputStream(sock.getInputStream(), 262144))
val output = DataOutputStream(sock.getOutputStream()) val output = DataOutputStream(BufferedOutputStream(sock.getOutputStream(), 262144))
val requestJson = input.readUTF() val requestJson = input.readUTF()
val request = try { val request = try {
@@ -135,7 +138,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
updateIncoming(progress.copy(state = TransferState.TRANSFERRING)) updateIncoming(progress.copy(state = TransferState.TRANSFERRING))
file.outputStream().use { fos -> file.outputStream().use { fos ->
val buffer = ByteArray(65536) val buffer = ByteArray(262144)
var remaining = request.fileSize var remaining = request.fileSize
while (remaining > 0) { while (remaining > 0) {
val toRead = minOf(buffer.size.toLong(), remaining).toInt() val toRead = minOf(buffer.size.toLong(), remaining).toInt()
@@ -220,12 +223,16 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
val job = scope.launch { val job = scope.launch {
try { try {
val socket = Socket(targetHost, targetPort) val socket = Socket()
socket.tcpNoDelay = false
socket.sendBufferSize = 1048576
socket.receiveBufferSize = 1048576
socket.connect(java.net.InetSocketAddress(targetHost, targetPort), 5000)
activeSockets[requestId] = socket activeSockets[requestId] = socket
socket.use { sock -> socket.use { sock ->
sock.soTimeout = 30_000 sock.soTimeout = 60_000
val input = DataInputStream(sock.getInputStream()) val input = DataInputStream(BufferedInputStream(sock.getInputStream(), 262144))
val output = DataOutputStream(sock.getOutputStream()) val output = DataOutputStream(BufferedOutputStream(sock.getOutputStream(), 262144))
output.writeUTF(Json.encodeToString(TransferRequest.serializer(), request)) output.writeUTF(Json.encodeToString(TransferRequest.serializer(), request))
@@ -244,7 +251,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
var bytesSent = 0L var bytesSent = 0L
var lastProgressTime = System.currentTimeMillis() var lastProgressTime = System.currentTimeMillis()
var lastProgressBytes = 0L var lastProgressBytes = 0L
val buffer = ByteArray(65536) val buffer = ByteArray(262144)
file.inputStream().use { fis -> file.inputStream().use { fis ->
while (true) { while (true) {
val read = fis.read(buffer) val read = fis.read(buffer)
@@ -80,6 +80,9 @@ class DesktopFileTransferManager : TransferManager {
try { socket.close() } catch (_: Exception) {} try { socket.close() } catch (_: Exception) {}
return return
} }
socket.tcpNoDelay = false
socket.sendBufferSize = 1048576
socket.receiveBufferSize = 1048576
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val progressId = UUID.randomUUID().toString() val progressId = UUID.randomUUID().toString()
var actualFile: File? = null var actualFile: File? = null
@@ -132,7 +135,7 @@ class DesktopFileTransferManager : TransferManager {
updateIncoming(progress.copy(state = TransferState.TRANSFERRING)) updateIncoming(progress.copy(state = TransferState.TRANSFERRING))
file.outputStream().use { fos -> file.outputStream().use { fos ->
val buffer = ByteArray(65536) val buffer = ByteArray(262144)
var remaining = request.fileSize var remaining = request.fileSize
while (remaining > 0) { while (remaining > 0) {
val toRead = minOf(buffer.size.toLong(), remaining).toInt() val toRead = minOf(buffer.size.toLong(), remaining).toInt()
@@ -218,12 +221,16 @@ class DesktopFileTransferManager : TransferManager {
val job = scope.launch { val job = scope.launch {
try { try {
val socket = Socket(targetHost, targetPort) val socket = Socket()
socket.tcpNoDelay = false
socket.sendBufferSize = 1048576
socket.receiveBufferSize = 1048576
socket.connect(java.net.InetSocketAddress(targetHost, targetPort), 5000)
activeSockets[requestId] = socket activeSockets[requestId] = socket
socket.use { sock -> socket.use { sock ->
sock.soTimeout = 30_000 sock.soTimeout = 60_000
val input = DataInputStream(sock.getInputStream()) val input = DataInputStream(BufferedInputStream(sock.getInputStream(), 262144))
val output = DataOutputStream(sock.getOutputStream()) val output = DataOutputStream(BufferedOutputStream(sock.getOutputStream(), 262144))
output.writeUTF(Json.encodeToString(TransferRequest.serializer(), request)) output.writeUTF(Json.encodeToString(TransferRequest.serializer(), request))
@@ -246,7 +253,7 @@ class DesktopFileTransferManager : TransferManager {
var bytesSent = 0L var bytesSent = 0L
var lastProgressTime = System.currentTimeMillis() var lastProgressTime = System.currentTimeMillis()
var lastProgressBytes = 0L var lastProgressBytes = 0L
val buffer = ByteArray(65536) val buffer = ByteArray(262144)
file.inputStream().use { fis -> file.inputStream().use { fis ->
while (true) { while (true) {
val read = fis.read(buffer) val read = fis.read(buffer)