2014-09-04 3 views
0

У меня есть gui, где я нажимаю кнопку отправки на одном ПК и кнопку приема на другом ПК, и он отправляет файл. Проблема в том, что я могу только отправить файл один раз, а затем я должен перезапустить приложение.java - Может только отправить файл один раз

Причины, которые он дает для сбоя, следующие: «Розетка закрыта» на отправляющем ПК, хотя я не понимаю, почему она это скажет. «ArrayIndexOutOfBounds» на принимающем ПК.

У меня есть эти два метода, которые я использую для отправки данных:

public void StreamIn() throws Exception {  //FOR RECEIVING FILES 

    byte[] mybytearray = new byte[size]; 
    InputStream is = sock.getInputStream(); 
    fos = new FileOutputStream(FILE_TO_RECEIVE); 
    bos = new BufferedOutputStream(fos); 
    bytesRead = is.read(mybytearray, 0, mybytearray.length); 
    current = bytesRead; 

    do { 
     bytesRead = is.read(mybytearray, current, (mybytearray.length - current)); 
     if (bytesRead >= 0) current += bytesRead; 
    } while (bytesRead > -1); 

    bos.write(mybytearray, 0, current); 
    bos.flush(); 

    if (fos != null) fos.close(); 
    if (bos != null) bos.close(); 
} 

public void StreamOut() throws Exception {  //FOR SENDING FILES 

    fis = new FileInputStream(myFile); 
    bis = new BufferedInputStream(fis); 
    bis.read(mybytearray, 0, mybytearray.length); 
    os = sock.getOutputStream(); 

    os.write(mybytearray, 0, mybytearray.length); 
    os.flush(); 

    if (bis != null) bis.close(); 
    if (os != null) os.close(); 
} 

По какой-то причине OutputStream обыкновения писать второй раз, хотя я закрываю и воссоздать их, прежде чем пытаться отправить другой файл. Я не понимаю, почему посылающий компьютер скажет, что сокет закрыт.

ответ

1

Вы закрываете сокет после отправки одного файла. Если вы хотите отправить другой файл, откройте другой сокет.

NB ваш цикл Копия верна в StreamIn(), но неверная в StreamOut(). Вы предполагаете, что read() заполняет буфер, и вы также при условии, что mybytearray является столь же большой как файл, и вы, таким образом, также при условии, что файл размер подходит в int.

каноническое способ копирования потоков в Java является:

while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Используйте это в обоих методах.

Также flush() до close() является избыточным.

Также StreamOut() отсутствует объявление для mybytearray.

+0

Спасибо за ответ, но то, что «буфер» в этом коде? А также, я не могу читать без окончательного закрытия выходного потока. Это также закрывает розетку? – Sixtoo

+0

Я вижу, что он закрывает сокет, а решение - использовать Socket.shutdownOutput() – Sixtoo

+0

** edit ** не совсем решение: вы не можете повторно использовать выходной поток после этого – Sixtoo