1

私がやろうとしていること:

client connects to server
server sends READY
client takes screenshot and sends it
server processes image

server sends READY
client takes screenshot and sends it
server processes image
...

私は動作しているクライアントとサーバーを持っています:

Client() {

    try {
        socket = new Socket(host, 4444);
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
        int ix = 0;
        while (true) {
            switch (in.readInt()) {
            case Var.READY:
                image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                ByteArrayOutputStream byteArrayO = new ByteArrayOutputStream();
                ImageIO.write(image,"PNG",byteArrayO);
                byte [] byteArray = byteArrayO.toByteArray();
                out.writeInt(byteArray.length);
                out.write(byteArray);
                System.out.println("send screen " + ix++);
                break;
            }
        }
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection " + e.getMessage());
        System.exit(1);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(1);
    }
}

サーバ:

 public class ServerWorker implements Runnable {

private Socket socket = null;

DataInputStream in = null;
DataOutputStream out = null;

ServerWorker() {

}

synchronized void setSocket(Socket socket) {
    this.socket = socket;
    try {
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    notify();
}

public synchronized void run() {
    int ix = 0;
    try {
        while (true) {
            out.writeInt(Var.READY);
            int nbrToRead = in.readInt();
            byte[] byteArray = new byte[nbrToRead];
            int nbrRd = 0;
            int nbrLeftToRead = nbrToRead;
            while(nbrLeftToRead > 0){ 
                int rd =in.read(byteArray, nbrRd, nbrLeftToRead);
                if(rd < 0)
                    break;
                nbrRd += rd; // accumulate bytes read
                nbrLeftToRead -= rd;
            }
            //Converting the image
            ByteArrayInputStream byteArrayI = new ByteArrayInputStream(byteArray);
            BufferedImage image = ImageIO.read(byteArrayI);
            System.out.println("received screen " + ix++);
            //image.flush();
            File of = new File("RecvdImg" + ix + ".jpg");
            ImageIO.write(image, "PNG" ,of);
            System.out.println("Sleeping 1..");
            Thread.sleep(1000);
        }
    } catch (Exception e) {
        e.printStackTrace();
        Thread.currentThread().interrupt();
    }
}
}

それで、あなたが尋ねるかもしれない質問は何ですか?さて、私はそれを正しくやっていますか?アクティビティ モニターは、クライアント側が常に約 40% の CPU を使用していることを示しています。

コードをより効率的にするために誰かが私を正しい方向に向けることができるかどうか疑問に思っています。

4

2 に答える 2

0

クライアントは、画像が変更されたかどうかを検出できます。変更されていない場合は、以前に受信した画像を再利用することを示すフラグをサーバーに送信できます。または、画像を「比較」し、変更された領域のみをサーバーに送信して、画像を再構成することもできます。これにより、帯域幅の使用量が削減され、おそらく CPU の使用量も削減されます。

また、クライアントは受信無限ループでしばらくスリープする必要がありますswitch

于 2012-08-12T22:46:37.380 に答える
0

私の意見では、次のような無限ループの使用は避けるべきです

while (true)

のようなループ

while(!connectionAborted)

そのような状況では優れています。

また、
Socket.setSoTimeout()もご覧ください。

SoTimeout は、in.readInt()パラメータに応じて、特定の時間が経過した後に ie の読み取りプロセスをキャンセルします。
その結果、この行で aSocketTimeoutExceptionがスローされますが、コードはこのコードラインで停止せず、別のユーザー入力に反応する可能性があります。

于 2012-08-12T22:54:46.383 に答える