1

リモートPC制御アプリケーションを作成しました。サーバーはRobotクラスによってキャプチャされたスクリーンショットを送信し、追加のスレッドはクライアントの入力(例:マウスクリック)をリッスンし、サーバーPCで同じことを行います。

しばらくすると、ヒープオーバーフローが発生します。おそらく、reset()を使用してObjectOutputStreamをクリーンアップする必要がありますが、最初に高速化するには、Imageオブジェクトを圧縮する方法を検討する必要があります。私が読んでいる限り、ImageIOは私を助けてくれるはずですが、ファイルに保存したりストリームに送信したりするのではなく、変換されたImageオブジェクトが欲しいだけです。もちろん、ImageIO.write(blablalb、blablal、myOutputStream)を使用してリスニングクライアントにObjectOutputStreamに送信したくないのはなぜですか。私が試したところ、例外やエラーはなく、読書やその他の問題が発生しましたが、クライアントのロガーは、2枚の写真(表示されなかった)を取得してからスタックしたと言います。圧縮なしの私の方法は、この面でうまく機能しますが。

したがって、保存または送信せずに変換してObjectに保持する(次にObjectOutputStreamを介して送信する)方法、または少なくともImageIOの使用上の問題を修正する方法についてのヘルプが必要です。私は最初の方法を好みます(バイトカウントコードなどを台無しにしたくない)。助けてくれてありがとう。

ここにいくつかのコードがあります、私はたくさんのクラスとコードを持っています、しかしこれが役立つことを願っています: 画像(ImageIconにラップされた)オブジェクトの送信方法

サーバー側の画像送信関連部分

public class BroadcastWorker implements Runnable {
    private ObjectOutputStream output;
    //private BlockingQueue<Image> imagesBuffer;
    private boolean finnish = false;
    private long frequency = 50;
    private Screen screen = new Screen();

    public BroadcastWorker(Socket connection) throws IOException {
        output = new ObjectOutputStream(connection.getOutputStream());
        //ImageIO.createImageOutputStream(output);
        // outputui resetas atlaisvina vietos

    }

    /*
    public void addImage(Image image) {
        imagesBuffer.add(image);
    }
    * 
    */

    private void send(Image image) throws IOException {
        System.out.println("Sending image");
        output.writeObject(new ImageIcon(image));
        //ImageOutputStream imageOutput = ImageIO.createImageOutputStream(output);
        //ImageIO.write((RenderedImage)image, "jpeg", imageOutput);
        System.out.println("image sent");
    }

    @Override
    public void run() {
        while (!finnish) {
            try {
                Thread.sleep(frequency);
            } catch (InterruptedException ex) {
                Logger.getLogger(BroadcastWorker.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                send(screen.getScreenshot());
            } catch (IOException ex) {
                Logger.getLogger(BroadcastWorker.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

画像の受信と設定に関連するコードの一部を含むClientGuiクラス

public class ClientGui1 extends javax.swing.JFrame {
    private Socket connection;
    private ScreenReceiveWorker receiver = new ScreenReceiveWorker();
    private ActionSendWorker actionSender = new ActionSendWorker();
    /**
    * 
    */
    class ScreenReceiveWorker extends SwingWorker {
        private Image progress;

        private void setScreen(Image progress) {
            this.progress = progress;
        }

        private Image getScreen() {
            return progress;
        }

        @Override
        protected Object doInBackground() throws Exception {
            ObjectInputStream input = new ObjectInputStream(connection.getInputStream());
            //ImageInputStream imageInput = ImageIO.createImageInputStream(input);

            while(true) {
                Thread.sleep(200);
                System.out.println("Screeeen");
                Image screen = ((ImageIcon) input.readObject()).getImage();
                //Image screen = ImageIO.read(imageInput);
                System.out.println("received");
                panelScreen.setImage(screen);
                panelScreen.repaint();

            }
        }
    }

......
.....
4

0 に答える 0