java - 为什么会抛出此异常以及如何从中恢复?

标签 java sockets network-programming java-io eofexception

我正在创建一个远程桌面屏幕截图应用程序。我在服务器上有两种方法1)从客户端读取图像2)读取客户端上运行的任务列表)。但每次我尝试读取客户端的输入流时,都会引发 EOF 异常。异常的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();

            }
        }
    }
}

最佳答案

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

整理一下。

关于java - 为什么会抛出此异常以及如何从中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078119/

相关文章:

java - Eclipse 没有完全关闭 ServerSocket

java - hibernate 与 EclipseLink

java - ServerSocket reuseAddress 允许绑定(bind)到一个已经绑定(bind)的端口?

java - 同时建立多个 TCP 连接

sockets - 如何从 Phoenix 框架中的套接字获取remote_ip?

java - 无法为我的 Java 应用程序选择正确的网络解决方案

java - 如何添加和忽略 json 响应的字段

java.util.Set.remove(Object o) - 问题

java - 使用静态工厂方法获取更新了一个字段的新实例是否正确?

带有用户输入的 C++ gethostbyaddr