質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Java

    15810questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1921questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Socket.IO

    218questions

    Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

  • JFrame

    25questions

    JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

javaでのリモートデスクトップ(PC遠隔操作)についての質問です。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,642

mojawo

score 1

javaについての質問です。
現在javaでリモートデスクトップソフトを作っています。当初はアンドロイドでPCを遠隔操作しようと考えていたのですがうまくいかなくてPC間でやろうと試行錯誤しています。
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

import javax.imageio.ImageIO;

public class ScshotClient {
public static void main(String[] args) {
new Connect();
}
}
class Connect {
static int PORT=54123;
static String hostName="owner-PC";
public Connect() {
OutputStream os=null;
BufferedOutputStream bos=null;
InputStream is=null;
BufferedReader irStr = null;
Socket soc=null;
while(true){
try {
soc = new Socket(hostName, PORT);
//soc.setSoTimeout(200);
os = soc.getOutputStream();
bos = new BufferedOutputStream(os);
is= soc.getInputStream();
irStr = new BufferedReader(
new InputStreamReader(is));
while(true){
ImageIO.write(Screenshot(), "png", bos);
bos.flush();
if(irStr.readLine().equals("ok"));
else break;
Thread.sleep(500);
}
} catch (IOException e) {
e.printStackTrace();
} catch (AWTException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
if(irStr!=null){irStr.close();irStr=null;}
if(bos!=null){bos.close();bos=null;}
if(soc!=null){soc.close();soc=null;}
} catch (IOException e) {
e.printStackTrace();
}

try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static BufferedImage Screenshot() throws AWTException, IOException {
Robot robot = new Robot();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
BufferedImage image = robot.createScreenCapture(
new Rectangle(0, 0, screenSize.width, screenSize.height));
return image;
}
}
import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class ScshotServer {     public static void main(String[] args) {         try {             ServerSocket serverSoc = new ServerSocket(54123);             while(true){             Socket socket=null;             socket = serverSoc.accept();//接続待ち             new Server(socket).start();             }             }catch (IOException e) {             e.printStackTrace();             }             }             }             class Server extends Thread implements MouseListener{             Socket soc=null;             InputStream is=null;             BufferedInputStream bis = null;             OutputStream os=null;             PrintWriter osStr =null;             static int bor=0;             public Server(Socket sc){             soc=sc;             bor++;             }             public void run(){             JFrame frame = new JFrame();             Window window = new Window();             frame.add(window);             frame.addMouseListener(this);             frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);             frame.addWindowListener(new WindowAdapter(){             public void windowClosing(WindowEvent we){             try {             if(osStr!=null){osStr.close();}             if(bis!=null){bis.close();}             if(soc!=null){soc.close();}             } catch (IOException e) {             e.printStackTrace();             }             }             });             frame.setBounds(bor*10, 10, 700, 500);             frame.setTitle("title");             frame.setVisible(true);             try {             // soc.setSoTimeout(200);             BufferedImage img;             is= soc.getInputStream();             bis = new BufferedInputStream(is);             os = soc.getOutputStream();             osStr = new PrintWriter(os, true);             while(true){             img=ImageIO.read(bis);             window.set_image(img);             osStr.println("ok");             osStr.flush();             }             } catch (IOException e) {             e.printStackTrace();             }finally{             try {             if(osStr!=null){osStr.close();}             if(bis!=null){bis.close();}             if(soc!=null){soc.close();}             } catch (IOException e) {             e.printStackTrace();             }             }             frame.setVisible(false);             }             @Override//クリック             public void mouseClicked(MouseEvent e) {             Point point = e.getPoint();             System.out.println("x:" + point.x + ",y:" + point.y);             }             @Override//領域に入ってきたとき             public void mouseEntered(MouseEvent arg0) {             }             @Override//領域から出て行ったとき             public void mouseExited(MouseEvent arg0) {             }             @Override//ボタンが押されたとき             public void mousePressed(MouseEvent arg0) {             }             @Override//ボタンが離されたとき             public void mouseReleased(MouseEvent arg0) {             }             }             class Window extends JPanel {             BufferedImage bimg=null;             public void set_image(BufferedImage img){             bimg=img;             repaint();             }             public void paintComponent(Graphics g){             g.drawImage(bimg, 0,0,getWidth(),getHeight(),this);             // TODO 自動生成されたメソッド・スタブ     } }
インデントバラバラで見辛いかもしれませんがすいません。
クライアントとサーバーでソケットを使いTCP通信をしています。サーバー側にクライアントの画面をキャプチャーした画像を送っています。サーバー側でクライアントのPCを遠隔操作する形になります。(普通は逆だと思うけど)
これからが本題でまずサーバーを起動し、待ち状態にします。次にクライアントを起動したとき通信先のアカウント名とポート番号を指定するためのウインドウを出したいと考えています。ウインドウにはテキストボックス2つと接続を開始しウインドウを閉じるボタンを一つ作ります。自分でコードを書いてみたのですがウインドウは出てこずエラーを吐き続ける状態になりました。
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.AbstractAction;

import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.Action;


public class ScshotClient extends JFrame {

    private JPanel contentPane;
    public final JTextField textField = new JTextField(5);
    public final JTextField textField_1 = new JTextField(20);
    public final JButton btnNewButton = new JButton("New button");
    public final Action action = new SwingAction();
    static int port;
    static String name;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ScshotClient frame = new ScshotClient();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        new Connect();
    }

    /**
     * Create the frame.
     */
    public ScshotClient() {
        textField_1.setBounds(217, 57, 155, 19);
        textField_1.setColumns(10);
        textField.setBounds(63, 57, 96, 19);
        textField.setColumns(10);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        contentPane.add(textField);
        
        contentPane.add(textField_1);
        btnNewButton.setAction(action);
        btnNewButton.setBounds(143, 158, 91, 21);
        
        contentPane.add(btnNewButton);
    }

    private class SwingAction extends AbstractAction {
        public SwingAction() {
            putValue(NAME, "接続");
            putValue(SHORT_DESCRIPTION, "Some short description");
            port = Integer.parseInt(textField.getText());
            name = textField_1.getText();
            setDefaultCloseOperation(EXIT_ON_CLOSE); 
        }
        public void actionPerformed(ActionEvent e) {
        }
    }
    static class Connect {// TODO 自動生成されたコンストラクター・スタブ
        public Connect() {
            OutputStream os=null;
            BufferedOutputStream bos=null;
            InputStream is=null;
            BufferedReader irStr = null;
            Socket soc=null;
                while(true){
                    try {
                        soc = new Socket(name, port);
                        //soc.setSoTimeout(200);
                        os = soc.getOutputStream();
                        bos = new BufferedOutputStream(os);
                        is= soc.getInputStream();
                        irStr = new BufferedReader(new InputStreamReader(is));
                        while(true){
                            ImageIO.write(Screenshot(), "png", bos);
                            bos.flush();
                            if(irStr.readLine().equals("ok"));
                            else break;
                            Thread.sleep(500);//500ミリ秒停止
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (AWTException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                    e.printStackTrace();
                    }
                    try {
                        if(irStr!=null){irStr.close();irStr=null;}
                        if(bos!=null){bos.close();bos=null;}
                        if(soc!=null){soc.close();soc=null;}
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
        }
        public BufferedImage Screenshot() throws AWTException, IOException {
            Robot robot = new Robot();
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            BufferedImage image = robot.createScreenCapture(
                    new Rectangle(0, 0, screenSize.width, screenSize.height));
            return image;
// TODO 自動生成されたメソッド・スタブ

        }
}
}
というふうに書いてみましたがコード上ではエラーが無くて困っています。
また遠隔操作するときにマウス、キーボードの動きをクライアント側でも同じようにするにはどうしたらいいのでしょうか?
教えてください。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

どのようなエラーが出て困っているのでしょうか?
それが分からないとどう回答して良いのか分かりません。

インデントバラバラで見辛いかもしれませんがすいません。

常にインデントがバラバラの状態で開発しているとしたら、それは改善した方が良いです。
Eclipseを使っているのでしたら、フォーマット機能があるので、それを利用してください。
ファイルを保存したときにフォーマットしてくれる機能もあります。


(追記)

ホストアドレスとポート番号が設定されていないからではないでしょうか。
ボタンを押したときに接続を開始するという仕様だとしたら、mainnew Connect()しているのが問題です。
ボタンを押したときに、画面で入力されたホストアドレスとポート番号が正しいことをチェックして、正しいことを確認して初めてnew Connect()を実行するように実装したほうが良いでしょう。


また遠隔操作するときにマウス、キーボードの動きをクライアント側でも同じようにするにはどうしたらいいのでしょうか? 

私はそういうことができるのかどうか分かりませんが、こういうサイトがありましたので、参考にしてみてはいかがでしょうか。
WebSocketを使ってリモートデスクっぽいVNCっぽいWebSocketRemoteというものを作ってみました (Kanasansoft Web Lab.)



(追記2)

java.lang.NumberFormatException: For input string: ""は、空文字列をInteger.parseIntintに変換しようとしたために発生した例外です。テキストフィールドに何も入力していないので、そのエラーが出ているのだと思います。


例外が発生したら、その例外をAPIドキュメントで調べてみましょう。

Java Platform SE 8 APIドキュメント

リモートデスクトップを本格的に作るのでしたら、わりと複雑な種類のアプリだと思いますので、この辺の基礎は自力で調べられないと難しいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/01/25 23:55

    回答に追記2を追加しました。

    キャンセル

同じタグがついた質問を見る

  • Java

    15810questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1921questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • Socket.IO

    218questions

    Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

  • JFrame

    25questions

    JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。