2014-06-09 2 views
0

모두. 나는 네트워크 프로그래밍의 초보자이다. 현재 Android 휴대 전화에서 Ubuntu 서버로 파일 (~ 2M 바이트)을 전송하는 실험을하고 싶습니다. 어떻게 최고 속도로 보낼 수 있습니까? 나는 Java에서 Bufferedreader를 사용하고, 파일에서 각 바이트를 읽고 소켓 "outputstream write"함수를 통해 서버에 단일 바이트를 보내는 것과 같은 것을 시도했다. 이 방법은 너무 많은 시간을 들여야하는 것처럼 보입니다. 동일한 네트워크 상태에서 Skype와 같은 일부 즉각적인 Messenger 도구를 사용하여 같은 파일을 보내면 내가했던 것보다 훨씬 빠릅니다. 아무도 인스턴트 메신저 소프트웨어 아래에 API 또는 구현 프로토콜을 알고 있습니까?WIFI를 통한 고속 파일 전송

소켓 이외의 다른 효율적인 API를 호출해야 할 필요가 있습니까? 나는 또한 바이트 배열로 전체 파일을 읽으려고하고 "소켓 쓰기"함수를 호출하여 서버에 거대한 바이트 배열을 보낸다. 단 하나의 time.Although 때 서버 쪽에서 많은 것을 발견했다. "패딩 제로 (padding zeros)"가 원본 데이터에 분산되어 있기 때문에 전체 전송은 "단일 바이트 전송"방법보다 시간이 덜 소요됩니다. 아무도 이것에 대한 조언이 있습니까? 고마워요!

+0

"패딩 0"에 대해 말하는 것은 의미가 없습니다. 버퍼의 크기가 아닌 모든 읽기 값을 반환해야합니다. 예를 들어'bRead = socket.read (buffer, 0, sizeof (buffer));'와 같이하면 bRead 바이트를 버퍼 크기가 아닌 파일에 써야합니다. –

답변

0

TCP/IP를 재발 명하지 않으면 전송 속도가 가장 빠릅니다 (손실이 적음). 전송자가 데이터 패킷에 시퀀스 번호를 추가하도록 패킷 시퀀스를 구현해야합니다. 수신기는 누락 된 패킷을 추적하고 모든 데이터가 전송 된 후에 다시 요청합니다. 모든 데이터가 수신 된 후 수신자는 전체 파일을 다시 어셈블 할 수 있습니다.

이것은 UDP를 통한 TCP의 단순한 구현입니다.

+0

몇 가지 API를 제공해 주시겠습니까? Android에서 검색하고 사용할 수 있습니다. 감사합니다. –

+0

추가 API가 없습니다. DatagramSocket <-> 소켓 연결, https://www.google.co.uk/search?q=java+datagramsocket입니다. –

1

모두의 답변에 감사드립니다. 나는 어리석은 실수를 저질렀다고 생각한다. TCP 소켓을 사용하여 저속 전송을하는 진정한 이유는 파일에서 단일 바이트를 읽고 "void write (int b)"를 호출하여이 단일 바이트를 server.This 메서드에 보내는 데 시간이 많이 걸릴 때마다 발생한다는 것입니다. 지금은 파일에서 256 바이트를 읽으려고 할 때마다 "void write (byte [] b, int off, int len)"를 통해이 256 바이트를 보냅니다. 이렇게하면 전송 속도가 꽤 빠릅니다. 따라서, TCP 그 자체의 문제. 잘못된 API를 호출하는 것은 내 실수입니다. 아직 UDP를 시도하지 않았습니다. 하지만 나는 또한 좋은 선택이라고 생각합니다. 다시 한 번 감사드립니다. 여러분.