2013-09-16 4 views
0

Я пишу собственный протокол. У меня есть имя команды, и код выглядит следующим образом.Отправка и создание файла

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(); 

} 

Эта команда отправляется на сервер клиента следующим образом pWriter.println("PUT");. Теперь я запускаю это, и он создает файл 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)' –

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