2013-07-26 1 views
1

Я работаю над проектом передачи файлов клиент-сервер, я почти завершил свои тесты на localhost, но сегодня получил ошибку ниже, вот исходные коды клиента и сервера:java file transfer socket write error

стороне клиента

public class Client { 

    public static void main(String args[]) { 
     String receiverIP = null; 
     int serverPort = 0; 
     receiverIP = args[0]; 
     serverPort = Integer.parseInt(args[1]); 
     String fileToSend = args[2]; 
     byte[] aByte = new byte[1]; 
     int bytesR; 
     Socket clientSocket = null; 
     BufferedOutputStream bos = null; 
     InputStream is = null; 

     try { 
      clientSocket = new Socket(receiverIP, serverPort); 
      bos = new BufferedOutputStream(clientSocket.getOutputStream());   
      is = clientSocket.getInputStream(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     }  

     if (is != null) {   
      FileOutputStream fos = null; 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      try { 

        File myFile = new File(fileToSend); 
        System.out.println("The file chosen is being sent..."); 
        byte[] mybytearray = new byte[(int) myFile.length()]; 
        FileInputStream fis = null; 

        try { 
         fis = new FileInputStream(myFile); 
        } catch (FileNotFoundException ex) { 
         ex.printStackTrace(); 
        } 
        try { 
         BufferedInputStream bis = new BufferedInputStream(fis); 
         bis.read(mybytearray, 0, mybytearray.length); 
         bos.write(mybytearray, 0, mybytearray.length); 
         bis.close(); 

         return; 
        }catch (IOException ex) { 
         ex.printStackTrace(); 
        } 

       File file = new File("C:\\copy.jpg"); 
       fos = new FileOutputStream(file); 
       bos = new BufferedOutputStream(fos); 
       bytesR = is.read(aByte, 0, aByte.length); 
       do { 
         baos.write(aByte); 
         bytesR = is.read(aByte); 
       } while (bytesR != -1); 
       System.out.println("File transfer successful"); 

       bos.write(baos.toByteArray()); 
       bos.flush(); 
       bos.close(); 
       clientSocket.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

стороне сервера

public class Server { 

    public static void main(String args[]) { 

     while (true) { 
      ServerSocket welcomeSocket = null; 
      BufferedOutputStream ToClient = null; 

      try { 
       welcomeSocket = new ServerSocket(3249); 
       System.out.println("The port " + welcomeSocket.getLocalPort() + " is opened and ready for use."); 
       Socket connectionSocket = welcomeSocket.accept(); 

       ToClient = new BufferedOutputStream(connectionSocket.getOutputStream()); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

здесь является Я получаю ошибку

The file chosen is being sent... 
java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at java.io.BufferedOutputStream.write(Unknown Source) 
    at Client.main(Client.java:44) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at Client.main(Client.java:55) 

Я почти уверен, что эта ошибка не о закрытии сокета сервера перед передачей всех данных, а также о процессе чтения и записи на ByteArray, но все мои попытки исправить был напрасным, может быть, Я потерял потоки, поэтому они не работают по назначению (файл copy.jpg создается, но не получает никаких потоков). Любая помощь будет принята.

Редактировать: Я забыл упомянуть, в настоящее время я использую беспроводное подключение к Интернету, и я немного читал про программирование сокетов, в котором упоминается, что беспроводные сети ненадежны для тестирования на

ответ

0

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

Вы можете проверить это поведение, используя telnet, что очень удобно при проверке серверов в целом. Откройте командную строку на компьютере-сервере (CMD или консоли) и выполните следующую команду для подключения к серверу:

telnet localhost 3249 

Вы увидите, что он подключается, а затем получает почти сразу же отключается, так же, как свой собственный клиентское приложение ,

Решение состоит в том, что помимо кода для приема соединения на стороне сервера вам необходимо написать код для получения данных.

Кроме того, вы должны установить создание серверного сокета перед циклом вместо внутреннего цикла. Вам нужно создать серверный сокет только один раз, и вы можете принять через него произвольно много подключений. Открытие сокета сервера более одного раза приведет к сбою, поскольку порт все еще занят (освобождение порта часто занимает несколько секунд в некоторых операционных системах, даже когда предыдущий серверный сокет был закрыт).