2013-01-12 3 views
0

채팅 클라이언트에 보내는 옵션을 만들고 작은 파일을 처리 할 수 ​​있었지만 큰 파일로 처리하려고 할 때 문제가 발생했습니다. 나는 그것을 해결하기 위해 시도하는 방법이었다 : 클라이언트 측 파일에서 읽고 보내DataOutputStream이 -1을 보내지 않습니다.

while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) { 
    os.write(bytearray,0,bytearray.length); 
} 
bin.close(); 

"빈은"그냥 정수 "BUF"FileInputStream 객체에서 내 BufferedInputStream을하고, 운영 체제 내 DataOutputStream 정렬입니다. 서버 측, 수신 및 전송 :

의 정수이며, "도스"는 DataOutputStream 정렬 (가 모든 클라이언트에 대해이 작업을 수행) 클라이언트 측에서 파일을 수신은 "BUF"는데 DataInputStream이다 "에서"
while ((buf = in.read(bytes, 0, bytes.length)) != -1) { 
dos.write(bytes,0,bytes.length); 
} 

서버와 하드 드라이브에 기록 "에서"여기

int buf; 
while ((buf = in.read(bytes, 0, bytes.length)) != -1) { 
    fos.write(bytes,0,bytes.length); 
} 
fos.close(); 

는의 DataInputStream이다 "FOS는"FileOutputStream 또는이다. 무슨 일이 일어날 때 첫 번째 클라이언트에서 보내기 단추를 누르면 서버와 클라이언트 모두 파일을 받기 시작하지만 두 번째 클라이언트 (수신기)를 닫을 때만 수신됩니다. 소켓이 닫히고 아마 그 때 실제로 파일 수신을 중단하고 파일 쓰기를 마치기로 결정합니다. 송신이 한번 실행되고 dataInputStream이 서버에서 비어 있어야하므로 "-1"이 발생하는 이유는 무엇인지 말해주십시오.

+1

마지막 코드 스 니펫과 별도로 출력 스트림을 닫지 않는 것 같습니다. – biziclop

+0

-1을 반환해야하는 메서드/개체는 무엇입니까? –

+0

출력 스트림을 닫지 않을 것입니다. 왜냐하면 소켓을 닫으면 채팅 클라이언트가 끊어지기 때문입니다. – vejmartin

답변

2

DataOutputStream never은 -1을 보냅니다. 원본 스트림은 출력 스트림을 닫을 때 피어 (peer)에게 EOS 신호를 보내면, read() API에 의해 -1이 반환됩니다. 유선에 -1이 없습니다. 출력 스트림을 닫지 않으면 -1을 수신하지 않습니다.

출력 스트림을 닫지 않고 읽는 것을 멈추게하려면 응용 프로그램 프로토콜의 일부로 말해야합니다. 예를 들어, 데이터 앞에 길이 단어를 보내고 판독기가 정확하게 읽도록하십시오 그 많은 바이트.

관련 문제