2014-02-17 2 views
3

Привет У меня возникли проблемы с методом readLong()DataInputStream. Когда я ставлю значение через 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(); 

EDIT

Если кто-нибудь может помочь мне с кодом, который очень ценится, я новичок в сокетах, и я немного запутался в вещах, все, что мне нужно, это отправить длину файла, используя writeLong метод dataoutputstream и отправить также имя с writeUTF, но я не знаю, что происходит и как его исправить.

+1

В вашем коде отсутствует 'GetLong()' ... – Rainbolt

+0

, он имеет только чтение и всегда получает неправильное значение –

+0

В DataOutputStream нет метода getLong() или readLong(). Исправьте свой титул. – EJP

ответ

1

Проблема заключается в способе writeUTF.

javadoc говорит:

Записывает строку в выходной поток базового использованием модифицированного UTF-8, кодирование в машинно-независимым способом.

Сначала два байта записываются в выходной поток, как если бы методом writeShort указывалось количество байтов. Это значение - - количество фактически выписанных байтов, а не длина строки . По длине каждый символ строки выводится, в последовательности, используя модифицированную кодировку UTF-8 для символа. Если не выбрасывается исключение, счетчик, записанный, увеличивается на общее количество байтов, записанных в выходной поток. Это будет на наименьших двух плюс длина str, и не более двух плюс трижды длина str.

Но вы используете свою собственную кодировку длины, которая принимает только количество символов, содержащихся в строке. Он не использует кодированную длину вашей строки.

Вам не нужно использовать собственную кодировку длины, если вы используете DataInputStream.readUTF() для чтения вашей строки.

0

Сервер отправляет это:

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

затем файл.

Клиент читает это:

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

затем файл.

Итак, вы читаете filesCount, что вы не отправляете вообще, и не читаете fileName, который вы отправляете. Так как же это может работать?

Если вы не прочитали точно, что отправляете, с помощью дополнительных методов, это не сработает.

Смежные вопросы