0

私のプログラムは、ユーザーが私のプログラムを使用しているときに、スクリーンショットを作成するためにユーザーの画面の写真を撮り、それをサーバーに送信します。画像は約1/4の距離で読み込まれ、フリーズします。

スクリーンショットの送信:

            BufferedImage buffimg = robot.createScreenCapture(captureSize);
            BufferedImage image = buffimg;
            byte[] imageInByte;


            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            baos.flush();
            imageInByte = baos.toByteArray();
            baos.close();

            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            PrintWriter out = new PrintWriter(socket.getOutputStream());

            out.println("!SCREENDATA!");
            out.flush();
            dos.writeInt(baos.toByteArray().length);
            dos.write(baos.toByteArray());
            dos.flush();

画像の取得:

                    if (input.startsWith("!SCREENDATA!")) {
                        System.out.println("reading");

                        DataInputStream dis = new DataInputStream(socket.getInputStream());
                        int len = dis.readInt();
                        System.out.println(len);
                        byte[] data = new byte[len];

                        dis.read(data);
                        InputStream in = new ByteArrayInputStream(data);
                        Image image = Toolkit.getDefaultToolkit().createImage(data);

                        v.repaint(image);
                    }

画像の表示:

public void repaint(Image img) {

    frame.getContentPane().add(new JLabel(new ImageIcon(img)));
    frame.repaint();
    frame.pack();

}

誰かがこれを手伝ってくれるなら、私はそれを大いに感謝します!

4

1 に答える 1

1

dis.read(data);TCPソケットのこのメソッドは、1回の呼び出しでバッファー全体を提供するように設計されていないため、呼び出しを続ける必要があります(これはストリームソケットであり、継続します)。ただし、ソケットに提供するデータがない場合、メソッド呼び出しはブロックされることに注意してください。また、ファイルのサイズをファイルの前に送信して、相手側が予想する量を認識できるようにすることをお勧めします。無限ループを引き起こす可能性のあるプロトコルエラーが発生しにくくなります。

Javaソケットを使用してクライアントとサーバー間でファイルを転送する方法についての回答をご覧ください。

とにかく、アナロジー:ソケットには512kbのバケツがいっぱいになります。2048kbのバケットがあります。ソケットバケットを自分のバケットに注ぎ続ける必要があります。

また、Swingは、イベントディスパッチスレッドにない限り、何もしないでください。イベントディスパッチスレッドをどのように使用しますか?を参照してください。詳細については。

于 2012-07-11T05:04:41.617 に答える