2009-09-21 5 views
2

Java로 파일 전송 애플리케이션을 개발하려고합니다. 애플릿은 클라이언트로, 독립형 Java 애플리케이션은 서버로 (데이터 센터에서 호스트되는 전용 머신에서) 개발하려고합니다. DataOutputStream/DataInputStream을 사용하여 양쪽에서 데이터를 전송합니다. 대용량의 데이터를 전송할 때 대역폭은 매우 다양합니다. 모두 괜찮습니다. 그런 다음 전송되는 동안 TCP 스트림이 40-50 초 동안 정지 된 후 다시 시작됩니다.자바 소켓과 TCP 튜닝

Ethereal을 사용하여 TCP 스트림을 보면 복제 재발견, 빠른 재전송 및 TCP 재전송을 볼 수 있습니다. 하지만 문제는 Java에서 발생한 것이라고 생각하지 않습니다. FileZilla에서 FTP 전송과 동일한 문제가 있습니다. 하지만 ... netcat (netcat 클라이언트 + netcat 서버)을 사용하여 데이터를 전송하려고하면 대역폭이 안정적이며 tcp 손실 패킷은 전송 된 볼륨에 관계없이 일시 중지없이 즉시 재전송 된 것으로 보입니다.

그것은

나는 Socket.setSendBufferSize()를 재생하려고하지만, 나는 어떤 차이를 보지 못했어요 ... 자바의 TCP 스트림을 재생할 netcat을만큼 재능이 아니었다면 같아요. 아이디어가 있으십니까?

감사합니다. 그리고 나쁜 영어에 대해 유감스럽게 생각합니다.

+3

dup : http://stackoverflow.com/questions/1169739/java-tcp-socket-data-transfer-is-sloooooow – amischiefr

답변

0

기본적으로 대역폭을 제한하는 TCP 윈도우 잉 (나는 올바른 단어라고 생각합니다.

1

Mr amischiefr이 맞습니다! 다른 스레드에서와 동일한 문제입니다. DataXXputStream을 BufferedXXXputstream으로 대체하면 문제가 해결되었습니다. write (byte [], off, len) 메서드는 동일하고, 다른 동작에 대해서는 doc에서 이야기하지 않습니다. DataOutputStream도 버퍼링되고, BufferedOutputStream도 있지만 두 번째 버퍼가 훨씬 좋습니다. 감사합니다.