2014-02-17 5 views
3

안녕하세요 DataInputStream.readLong() 메서드로 문제가 있습니다. DataOutputStream.writeLong()을 통해 값을 입력하면 올바른 값이지만 전송 될 때 더 커야합니다. 프로그램이DataInputStream readLong()이 잘못된 값을 얻음

이 클라이언트

socket = new Socket(ipAddress, Port); 

    bos = new BufferedOutputStream(socket.getOutputStream()); 
    dos = new DataOutputStream(bos); 

    File f = new File("C:/Users/lukeLaptop/Downloads/RemoveWAT22.zip"); 

    long length = f.length(); 
    dos.writeLong(length); 

    String name = f.getName(); 
    dos.writeUTF(name); 

    FileInputStream fis = new FileInputStream(f); 
    bis = new BufferedInputStream(fis); 

    int theByte = 0; 
    while ((theByte = bis.read()) != -1) { 
     bos.write(theByte); 
    } 
    bis.close(); 

    dos.close(); 

서버 측

ServerSocket server = new ServerSocket(8080); 

    while (true) { 
     socket = server.accept(); 

     System.out.println("Got a client !"); 

     bis = new BufferedInputStream(socket.getInputStream()); 

     dis = new DataInputStream(bis); 

     int filesCount = dis.readInt(); 



     long fileLength = dis.readLong(); 
     //String fileName = dis.readUTF(); 

     File f = new File("C:/test/here/test.zip"); 

     FileOutputStream fos = new FileOutputStream(f); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 

     for (int j = 0; j < fileLength; j++) { 
      bos.write(bis.read()); 
     } 

     bos.close(); 
     dis.close(); 
이다 동결하지 않도록 내가 실행 가능한 한 Statment의 코드를 모두 가지고있을

EDIT

코드가 도움이된다면 소켓에 익숙하지 않고 약간 혼란스러워지고 있습니다. writeLong을 사용하여 파일의 길이를 보내고 싶습니다. 메서드를 사용하여 writeUTF 및 writeUTF 함께 이름을 보내지 만 무슨 일이 일어나고 어떻게 수정 해야할지 모르겠다.

+1

코드에 GetLong()이 없습니다 ... – Rainbolt

+0

오직 readlong 만 있고 항상 잘못된 값을 얻습니다. –

+0

DataOutputStream에는 getLong() 또는 readLong() 메소드가 없습니다. 제목을 수정하십시오. – EJP

답변

1

문제는 writeUTF입니다.

javadoc 말한다 :

는 시스템에 의존하지 않는 변형 UTF-8 인코딩을 사용하여 기본 출력 스트림에 기입.

먼저, 출력 스트림에 두 바이트가 쓰여지고 마치 writeShort 메소드에 의해 마치 뒤 따르는 바이트 수를 제공합니다. 이 값은 문자열의 길이가 아니라 실제로 쓰여진 바이트 수인 입니다. 길이 뒤에 문자열의 각 문자가 수정 된 UTF-8 인코딩을 사용하여 차례로 출력됩니다. 예외가 throw되지 않는 경우, 카운터 출력은 출력 스트림에 기록 된 총 바이트 수만큼 증가합니다. 이것은 에 str의 길이에 2를 더한 값을 더하고, 2를 더한 값에 str의 길이 인 3을 더한 값이됩니다.

그러나 길이 인코딩을 사용하면 문자열에 포함 된 문자 수만 사용됩니다. 문자열의 인코딩 된 길이는 사용하지 않습니다.

DataInputStream.readUTF()을 사용하여 문자열을 읽는 경우 길이 인코딩을 사용할 필요가 없습니다.

0

서버는이를 보냅니다

dos.writeLong(length); 
dos.writeUTF(name); 

파일 하였다.

클라이언트는이 읽

int filesCount = dis.readInt(); 
long fileLength = dis.readLong(); 
//String fileName = dis.readUTF(); 

파일 하였다.

따라서 filesCount은 전혀 전송하지 않고 읽고있는 fileName을 읽지 않습니다. 어떻게 작동할까요?

보완 방법을 사용하여 보내는 내용을 정확하게 읽지 못할 경우 작동하지 않습니다.