有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么会引发此异常以及如何从中恢复?

我正在创建一个远程桌面截图应用程序。我在服务器上有两种方法1)从客户端读取图像2)读取客户端上运行的任务列表)。但每次我试图读取客户机的输入流时,都会抛出一个EOF EXACTION。异常的stakctrace是

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)

以下是引发异常的服务器上的代码

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

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

以下是客户端的完整代码

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

            }
        }
    }
}

共 (2) 个答案

  1. # 2 楼答案

    您正在从客户端向端口5494打印和写入对象。服务器只读取对象

    解决它