Supun Athukorala
Supun Athukorala

Reputation: 58

java.io.EOFException while reciving a object. send file from client to server through socket

I a creating a an android app that can share files through socket. First I am creating a Server that will run on every app and if a one app wants to send a file to another user then he can select a server ip address and send file.

here is the server part

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

Here is the client part

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

    }
}

I am getting java.io.EOFException of the server in this part. Any help would be great.

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

Upvotes: 0

Views: 1308

Answers (1)

user207421
user207421

Reputation: 310913

The peer has closed the socket, which causes end of stream at the receiver, which causes an EOFException in readObject().

There are several problems here. Neither the server nor the client should close socket in those finally blocks:

  • The finally block in the server should close serverSocket, not socket, and socket should be a local variable in theaccept()` loop, not in the outer scope. It has no meaning once the loop has iterated.
  • The client should close socket in the thread that is started to handle it, not in the code that starts the thread.
  • The client doesn't even appear to be creating an ObjectOutputStream, at least not in the code you posted. If you're not going to use ObjectOutputStream at the sender, you can't use ObjectInputStream at the receiver.

Upvotes: 1

Related Questions