2015-09-11 2 views
0

Я создаю приложение для Android, которое может обмениваться файлами через сокет. Сначала я создаю Сервер, который будет запускаться в каждом приложении, и если одно приложение хочет отправить файл другому пользователю, тогда он может выбрать IP-адрес сервера и отправить файл.java.io.EOFException при возврате объекта. отправлять файл с клиента на сервер через сокет

здесь серверная часть

public class ServerSocketThread extends Thread { 

    @Override 
    public void run() { 
     Socket socket = null; 
     try { 
      serverSocket = new ServerSocket(SocketServerPORT); 
      MessageActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        infoPort.setText("I'm waiting here: " 
          + serverSocket.getLocalPort()); 
       }}); 

      while (true) { 
       socket = serverSocket.accept(); 
       // FileTxThread fileTxThread = new FileTxThread(socket); 
       // fileTxThread.start(); 
       //--------------------------------- 
       ClientRxThread clientRxThread = new ClientRxThread(socket); 
       clientRxThread.start(); 
       //---------------------------------------- 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

} 
private class ClientRxThread extends Thread { 
    Socket socket = null; 


    ClientRxThread(Socket socket) { 
     this.socket=socket; 
    } 

    @Override 
    public void run() { 

     File file; 
     ObjectInputStream ois; 
     ois = null; 
     InputStream in = null; 
     byte[] bytes; 
     FileOutputStream fos = null; 


     file = new File(getApplicationInfo().dataDir, "test.png"); 
     try { 
       in = socket.getInputStream(); 
      } catch (IOException ex) { 
       System.out.println("Can't get socket input stream. "); 
      } 
     try { 
      ois = new ObjectInputStream(in); 
     } catch (IOException e1) { 
      System.out.println("Can't get Object Input Stream. "); 
      e1.printStackTrace(); 

     } 
     try { 
      assert ois != null; 
      bytes = (byte[])ois.readObject(); 
     } catch (ClassNotFoundException | IOException e) { 
      System.out.println("Can't read Object . "); 
      bytes= new byte[0]; 
       e.printStackTrace(); 
      } 

     try { 
      fos = new FileOutputStream(file); 
     } catch (FileNotFoundException e1) { 
      System.out.println("Can't get file output stream . "); 
      e1.printStackTrace(); 
     } 


     try { 
      assert fos != null; 
      fos.write(bytes); 
     } catch (IOException e1) { 
      System.out.println("Can't file output stream write . "); 
      e1.printStackTrace(); 
     } 
     finally { 
       if(fos!=null){ 

        try { 

         fos.close(); 
         socket.close(); 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
       } 
      } 
      MessageActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Toast.makeText(MessageActivity.this, 
          "Finished", 
          Toast.LENGTH_LONG).show(); 
       }}); 
      if(socket != null){ 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

Вот клиентская часть

private class ClientRxThread extends Thread { 
    String dstAddress; 
    int dstPort; 

    ClientRxThread(String address, int port) { 
     dstAddress = address; 
     dstPort = port; 
    } 

    @Override 
    public void run() { 
     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 

      FileTxThread fileTxThread = new FileTxThread(socket); 
      fileTxThread.start(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if(socket != null){ 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

public class FileTxThread extends Thread { 
    Socket socket; 

    FileTxThread(Socket socket){ 
     this.socket= socket; 
    } 

    @Override 
    public void run() { 
     File file = new File(newImageUri.getPath()); 

     byte[] bytes = new byte[(int) file.length()]; 
     BufferedInputStream bis; 
     try { 
      bis = new BufferedInputStream(new FileInputStream(file)); 
      final int read = bis.read(bytes, 0, bytes.length); 

      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
      oos.writeObject(bytes); 
      oos.flush(); 

      socket.close(); 

      final String sentMsg = "File sent to: " + socket.getInetAddress(); 
      FileSharingActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Toast.makeText(FileSharingActivity.this, 
          sentMsg, 
          Toast.LENGTH_LONG).show(); 
       }}); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

Я получаю java.io.EOFException сервера в этой части. Любая помощь будет большой.

try { 
      ois = new ObjectInputStream(in); 
     } catch (IOException e1) { 
      System.out.println("Can't get Object Input Stream. "); 
      e1.printStackTrace(); 

ответ

1

Пир закрыл сокет, который вызывает конец потока в приемнике, который вызывает EOFException в readObject().

Здесь есть несколько проблем. Ни сервер, ни клиент должен закрыть socket в этих блоках finally:

  • finally блок в сервере должен закрыть serverSocket, не socket и socket should be a local variable in the принимают() `петлю, а не во внешней области. Он не имеет значения, если цикл повторяется.
  • Клиент должен закрыть socket в потоке, который начал обрабатывать его, а не в коде, который запускает поток.
  • Клиент даже не создает ObjectOutputStream, по крайней мере, не в коде, который вы опубликовали. Если вы не собираетесь использовать ObjectOutputStream у отправителя, вы не можете использовать ObjectInputStream у получателя.
Смежные вопросы