Question

I am creating a remote-desktop screenshot application. I have two methods on the server 1) To read the Image from client 2) to read the list of task running on the client). But everytime I try to read the client's input stream an EOF excetion is thrown. The stakctrace of the exception is

java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2792) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:799) at java.io.ObjectInputStream.(ObjectInputStream.java:299) at remoteserverclient.original.ScreenServer$ServerThread.run(ScreenServer.java:254)

Here is the code on the server where the exception is thrown

ObjectInputStream in = new ObjectInputStream(client.getInputStream());

                    Object obj = in.readObject();
                    if (obj instanceof Rectangle) {
                        CaptureScreen(obj, in);
                    } else if (obj instanceof String) {
                        CaptureList(in);
                    }

Here is the complete code for the client

public class ScreenClient {

    static Socket server;

    public static void main(String[] args) throws Exception {
        try {


            while (true) {
                server = new Socket("localhost", 5494);
                BufferedReader bf = new BufferedReader(new InputStreamReader(server.getInputStream()));
                String s;
                s = bf.readLine();

                System.out.println(s);
                if (s.contains("execute")) {
                    new ClientMessageThread().start();
                }
                if (s.contains("getProcessList")) {
                    new ClientFetchProcessThread().start();
                }
            }
        } catch (Exception e) {
            System.err.println("Disconnected From server ->" + e.getMessage());
        }
    }

    public static class ClientMessageThread extends Thread {
      Socket server;
        public ClientMessageThread() {
          try {
              server=new Socket("localhost",5494);
          } catch (Exception ex) {
              ex.printStackTrace();
          }
        }



        @Override
        public void run() {
            try {


                BufferedImage screen;

                Robot robot = new Robot();
                Rectangle size = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

                screen = robot.createScreenCapture(size);

                int[] rgbData = new int[(int) (size.getWidth() * size.getHeight())];

                screen.getRGB(0, 0, (int) size.getWidth(), (int) size.getHeight(), rgbData, 0, (int) size.getWidth());



                OutputStream baseOut = server.getOutputStream();

                ObjectOutputStream out = new ObjectOutputStream(baseOut);

                out.writeObject(size);

                for (int x = 0; x < rgbData.length; x++) {

                    out.writeInt(rgbData[x]);

                }

                out.flush();
                server.close();
                //added new
            } catch (Exception e) {
                System.err.println("Disconnected From server ->" + e.getMessage());
            }
        }
    }

    public static class ClientFetchProcessThread extends Thread {
        Socket server;
        public ClientFetchProcessThread() {
          try {
              server=new Socket("localhost",5494);
          } catch (Exception ex) {
              ex.printStackTrace();
          }
        }
        public void run() {


            try {
                PrintWriter ps;

                System.out.println("\n\n********");
                StringBuilder builder = new StringBuilder("");
                String query = "tasklist";

                Runtime runtime = Runtime.getRuntime();
                InputStream input = runtime.exec(query).getInputStream();
                BufferedInputStream buffer = new BufferedInputStream(input);
                BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));
                String line = "";
                ps = new PrintWriter(server.getOutputStream(), true);
                while ((line = commandResult.readLine()) != null) {
                    builder.append(line + "\n");

                    //byte[] responseClient=s.getBytes();


                    ps.write(builder.toString());
                    System.out.println(builder.toString());


                }
                server.close();
            } catch (Exception e) {
                e.printStackTrace();

            }
        }
    }
}
Was it helpful?

Solution

You're both printing and writing objects to port 5494 from the client. The server only reads objects.

Sort it out.

OTHER TIPS

The exception being thrown is EOFException (End of file exception).

ObjectInputStream throws EOFException when it reaches the end of the input. That's standard behaviour. Are you catching all exceptions thrown by in.readObject()?

Documentation:

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top