2013-09-16 10 views
0

사용자 지정 프로토콜을 쓰고 있습니다. 나는 명령 이름을 넣었고 코드는 다음과 같이 보입니다. pWriter.println("PUT");을 다음과 같이파일 보내기 및 만들기

if(commandString.equals("PUT")){ 
    File f = new File(currentFolder, "test.txt"); 
    if(!f.exists()) 
     f.createNewFile(); 
    FileOutputStream fout = new FileOutputStream(f); 
    long size = 150; 
    long count = 0; 
    int bufferLeng = 0; 
    byte[] buffer = new byte[512]; 
    while((bufferLeng = dis.read(buffer))>0) //dis is a data input stream. 
    { 
     count =+ bufferLeng; 
     fout.write(buffer); 
    } 
    System.out.println("All Good"); 
    fout.flush(); 
    fout.close(); 

} 

이 명령은 클라이언트에서 서버로 전송됩니다. 이제 이걸 실행하고 파일 test.txt을 만들었지 만 동결 상태이며 서버에 좋은 메시지가 표시되지 않습니다. 이것이 왜 쉬운가요?

서버와 클라이언트가 작동합니다!

고맙습니다.

+0

'dis.read (버퍼)를 작동한다'블로킹 호출이다. 고객이 연결을 닫습니까? –

+0

코드가 컴파일 될 것이라고 생각하지 않습니다. 'if (commandString.equels ("PUT")) {'commandString'이'java.lang.String'이 아닌 한 (네이밍 규약이 정확하지 않은 경우를 제외하고)'equels (String) '메소드가 존재하지 않습니다. 아마도 당신은'if (commandString.equals ("PUT")) {' –

+0

그렇습니다. 클라이언트가 연결을 닫습니다. –

답변

0

아마도 dis.read(buffer)을 제거하고 다음을 사용하십시오.

if(commandString.equals("PUT")){ 
    File f = new File(currentFolder, "test.txt"); 
    if(!f.exists()) 
     f.createNewFile(); 
    FileOutputStream fout = new FileOutputStream(f); 
    long size = 150; 
    long count = 0; 

    byte[] buffer = new byte[512]; 
    int bufferLeng = buffer.length; 
    while(count < size && bufferLeng>0) //dis is a data input stream. 
    { 

     fout.write(buffer); 
     count =+ bufferLeng; 
    } 
    System.out.println("All Good"); 
    fout.flush(); 
    fout.close(); 

} 

+0

고맙습니다. –

1

서버는 클라이언트가 소켓을 닫을 때까지 기다립니다. 그러면 파일 끝 부분이 전송되어 dis.read()이 -1을 반환합니다.

일반적으로 원하는 것은 아닙니다. 해결책은 데이터 앞에 파일 크기를 보내고이 양의 데이터를 정확하게 읽는 것입니다.

클라이언트가 파일 데이터의 마지막 바이트를 기록한 후 socket.flush()을 호출했는지 확인하십시오. 그렇지 않으면 데이터가 버퍼에 걸려 서버가 중단 될 수 있습니다.

+0

파일의 마지막 바이트를 쓰고 난 후에 플러시 할 때 여전히 멈 춥니 다. –

+0

클라이언트가 보내는 것보다 많은 바이트를 읽지 않도록하십시오. 너무 많은 단일 바이트를 읽는다면 멈출 것입니다. 'read (buffer, offset, length) '메서드를 사용하고 루프 반복의 길이를 계산해야합니다. –

+0

또한'read()'가 버퍼에 넣은 바이트 만 쓰는 지 확인하십시오 ->'write (buffer, offset, length)' –

관련 문제