リモート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();
}
}
}
......
.....