2014-05-12 4 views
3

이미지 업로드 진행 상황을 게시하려고합니다. 내 클라이언트로 okhttp를 사용하여 업로드하고, 멀티 파트 파일을 패키지하려면 mimecraft로 업로드하십시오.OkHttp 버퍼는 flush()에도 불구하고 데이터를 업로드하기 전에 ~ 800kb.

데이터가 소켓에 쓰여질 때 바이트 수를 기록하기 위해 로그를 추가했습니다 (올바르게 말할 수있는 경우 4KB의 청크로).

문제는 데이터 덩어리가 기록 될 때마다 outputstream에서 flush를 호출하는 동안 출력 스트림에 ~ 800kb가 기록 될 때까지 아무 것도 업로드되지 않는 것입니다. 일단 그 지점에 도달하면 ~ 100kb를 업로드하는 것처럼 보입니다. 그런 다음 앱은 outputstream에 다른 100kb를 씁니다 (자유 공간과 같이 조금 더 쓸 수 있습니다). 계속 진행합니다.

이 결과는 첫 번째 800kb가 거의 즉시 작성 /보고되고 업로드가 시작되고 (찰스 네트워크 소프트웨어를 통해 추적 됨) 읽기/쓰기/업로드를 시작합니다. 다음 몇 초 동안 100kb, 그리고 나서 마지막 바이트를 출력 스트림에 기록한 후 업로드의 100 %가 기록됩니다. 네트워크 클라이언트가 아직 네트워크 버퍼에있는 마지막 800kb를 계속 업로드하고 있으며이를 5-10 초 동안 업로드 한 다음 요청을 완료하면이 사실은 사실입니다.

누구나이 경험을했거나 이것이 okhttp의 일반적인 문제인지 알고 있습니까?

건배

편집 : 800킬로바이트보다 작은 파일을 업로드하면, 필자는 일부 2백50킬로바이트 및 5백킬로바이트 테스트, 그들은 모두 즉시 업로드되기 전에 스트림에 100 %를 기록 얻을하지만 3메가바이트 이미지는 여전히 8백킬로바이트를 업로드합니다 , 그리고 대략 100kb 청크에서 눈을 떼고, 쓰기 루프는 업로드 될 때마다 또 다른 100kb를 쓰면서 거기에 앉는다.

+0

성공 했습니까? 또한 업로드 코드를 공유하십시오. –

+0

이것에 관한 어떤 소식이라도 나는 같은 문제에 직면 해있다? – coalmee

답변

-1

출력 스트림을 열기 전에 setFixedLengthStreamingMode(content length) 또는 setChunkedStreamingMode(0)으로 전화 해보십시오.

+1

필자는 올바른 내용 길이로'setFixedLengthStreamingMode()'를 호출 한 후'connection.getOutputStream()'을 호출했다. 그것은 확실히 콘텐츠 길이를 사용하여 설정, 마치 그것을 변경 (2 바이트 또는 뭐든간에 추가) 호출이 실패하고, 모든 바이트가 스트림에 기록되기 전에 업로드를 시작합니다. –

+0

두 가지 모두 시도한 후에도 여전히보고 된 동작이 표시됩니다. – nmr

1

소켓 송신 버퍼의 기본값은 높은 값이며 플러시는 연결되지 않습니다. Java 소켓을 동기화하는 방법을 찾기 위해 실패했지만 기본 Socket OutputStream은 플러시를 무시합니다.

https://github.com/square/okhttp/issues/1078

여기 송신 버퍼 크기 설정 끔찍한 해킹 포크 : @nmr에서 답으로 https://github.com/ACMEAtronOmatic/okhttp/tree/topic/hack-to-fix-socket-sendbuffer-size

+1

사용자 정의 된 버전의 okHttp를 사용하지 않는 방법이 있습니다. https://gist.github.com/slightfoot/00a26683ea68856ceb50e26c7d8a47d0 – Simon

+0

@simon이 의견은 꽤 대답입니다 - y, 아마도 답변으로 올려? – nmr