2012-06-27 1 views
0

PC (서버 측)에서 C# .Net 응용 프로그램은 Wi-Fi를 통해 Android 장치 (클라이언트 측)에 22000 바이트의 데이터를 전송해야합니다. 하지만 Android 기기의 dataInputStream은 2048 바이트 만 표시합니다.DataInputStream은 Android에서 2048 바이트의 데이터 만 수신합니까?

dataInputStream = new DataInputStream(workerSocket.getInputStream()); 
byte[] rvdMsgByte = new byte[dataInputStream.available()]; 
for (int i = 0; i < rvdMsgByte.length; i++) 
    rvdMsgByte[i] = dataInputStream.readByte(); 
String rvdMsgStr = new String(rvdMsgByte); 

나는 다음과 혼란 스러워요 :

  1. 는 PC의 데이터 만 2048 바이트를 보낼 수 있습니까?
  2. 또는 Android 기기의 데이터 수신 용량은 2048 바이트입니까?
  3. 또는 dataInputStream에 장치가 모든 바이트를 수신 한 후에도 2048 바이트 만 표시됩니까?

    (data_received < = 2048 바이트) 이상 코드는 완벽하게 작동합니다.

+0

어쩌면 그것은'dataInputStream.available()'의 public 메소드'available()'의 제한에 있습니다. "더 많은 입력을 위해 블로킹하지 않고 읽거나 건너 뛸 수있는 예상 바이트 수를 반환합니다." http://developer.android.com/reference/java/io/InputStream.html에 따르면 필요한 경우 바이트 배열의 크기를 22000으로 설정하여 작동하는지 확인하십시오. – herom

+0

@herom 나는 같은 것을 먼저했습니다. 바이트 크기를 30000으로 설정했지만 EOFException이 나타납니다. :) – Krish

+0

내가 본다;) @ 존 Skeet는 그것을 잘 설명했다, 그것이 일하는 것을 듣는 것이 좋다 :) – herom

답변

5

기본적으로 InputStream.available()을 사용하지 않아야합니다. 즉, 얼마나 많은 데이터를 사용할 수 있는지 알려주는 것입니다. 지금은입니다.이 메시지는 여전히 네트워크를 통해 전송되는 경우 전체 메시지가 아닐 수도 있습니다. 작업이 완료 될 때까지

스트림 메시지의 끝에서 끝납니다 경우

, 당신은 단순히 한 번에 블록을 읽고, 루프를 유지해야한다 (양호하게는 하지 단지 한 번에 바이트를 읽어!). 예를 들어 : - 데이터는 일반적으로 최선의 방법입니다 전에 "메시지 길이"접두사를 전송하면 메시지로 스트림을 중단해야하는 경우

byte[] readFully(InputStream input) throws IOException { 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[8 * 1024]; // 8K buffer 
    int bytesRead; 
    while ((bytesRead = input.read(buffer)) > 0) { 
     output.write(buffer, 0, bytesRead); 
    } 
    return output.toByteArray(); 
} 

, 그 작업을 수행하는 방법을 고려해야합니다. 당신은 모든 데이터를 읽고 나면

, 당신은 이 작업을 수행하지해야합니다

String rvdMsgStr = new String(rvdMsgByte); 
텍스트로 바이트를 변환하는 플랫폼의 기본 인코딩을 사용합니다

. 이것이 진정한 텍스트 데이터라면 인코딩을 명시 적으로 지정할 수있는 문자열 생성자 오버로드를 사용해야합니다.

이 아닌 경우 진정한 텍스트 데이터 인 경우 해당 텍스트를 그대로 취급해서는 안됩니다. 문자열로 표현해야한다면 base64를 사용하십시오.

여기까지는 DataInputStream을 사용할 필요가 없습니다.

+0

그것에 관해 정말로 좋은 explanaition! 고마워 (비록 내가 스레드 소유자가 아니더라도);) – herom

+0

나는 java 또는 .net-C#에 대해 혼란 스럽다. 이 두 태그를 보면, OP가 C#에 대해 묻고 있고 Java에 대해 대답 한 것처럼 보입니다. – gdoron

+1

@gdoron : 클라이언트는 Java이고 서버는 C#입니다. –

관련 문제