Javaはリモートコントロールテクノロジーを実装しています
Javaに付属するJava.netとjava.awt.robot。のミックスを使用して、リモートマウスの動きとキーボードの入力を制御し、リアルタイムでリモートコンピューター画面の画像を取得するなど、ネットワーク上の別のコンピューターのリモートコントロールを実現するために使用できます。この記事では、このテクニックを習得する方法を教えるために、簡潔な言語と論理を浅いところから深く使用します。
まず、レンダリングを見てみましょう。
リモートコンピューターインターフェイス:
ターミナルコンピューターインターフェイスを制御:
コントロール端子入力:
リモート入力:
リモートコントロールの技術的なアイデアの詳細な紹介から始めましょう。
まず、2つのコンピューターがjava.netのソケットから接続されています。
最初に一方の端でサーバーソケットを開き、次にソケットでもう一方の端に接続します。
サーバー側
Serversocketをセットアップする必要があり、必要な入力ストリームと出力ストリームが初期化されます。
public static void openserver()throws ioException、classNotFoundException {system.out.println( "serverStart ......"); Serversocket Server = new Serversocket(7777); socket = server.accept(); system.out.println( "on connection .../n"+socket); ois = new ObjectInputStream(socket.getInputStream()); oos = new objectOutputStream(socket.getOutputStream()); }クライアント側<BR />ソケットを使用してサーバーに接続し、入力ストリームと出力ストリームを初期化する必要があります。
public static void startConnection(String IP、int Port)throws nownownshostexception、ioException、awtexception {socket = new Socket( "192.168.0.106"、7777); if(socket.isconnected()){system.out.println( "socket connected ..."+socket); } oos = new objectOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); }このようにして、2つのコンピューターがリンクされ、データはストリーム(inputstreamとoutputStream)を介して交換できます。
次に、2つのコンピューターがリモートコントロールと交換するために必要な情報について考えることができますか?まず、制御された端は、コントロールエンドに画面画像を継続的に提供する必要があり(これはjava.awt.robotを使用して実装されます)、マウスとキーボードは、コントロール端(ロボットを使用して実装された)によって送信されるイベント(inputevent)に基づいて同じ操作を行います。次に、コントロール端は最初に制御端によって送信された画像を受信し、パネル(ペイン)に反射し、次にマシン上のキーボードとマウスのアクションを監視し、制御端のホストに渡す必要があります(パネルペインにリスナーを設定することで実行できます)
ここで遭遇する問題の1つは、トランスミッションに使用される画像を使用しているかバッファリダイムを使用しているかにかかわらず、シリアル化できないことです。したがって、I/Osttreamを送信に使用することはできません。したがって、この問題を解決するには、クラスの画像データをカプセル化し、次のようにシリアル化可能なインターフェイス画像クラスを実装する必要があります。
Import java.io.file; Import java.io.fileinputStream; Import java.io.filenotfoundectection; import java.io.ioexception; import java.io.serializable; public classメッセージはシリアル化可能{private static final long serialversionuid = 1l;プライベート文字列ファイル名; //ファイル名Private Long Filelength; //ファイル長プライベートバイト[] filecontent; //ファイルコンテンツpublic Message(){} public message(string filepath)throws ioexception {file file = new file(filepath); this.fileLength = file.Length(); this.fileName = file.getName(); fileInputStream fis = new fileInputStream(filepath); byte [] bytes = new byte [(int)filelength]; fis.read(bytes、0、(int)filelength); this.filecontent = bytes; } public string getFileName(){return filename;} public void setFileName(string filename){this.filename = filename;} public long getFileLength(){return filelength; } public void setFileLength(long filelength){this.filelength = filelength;} public byte [] getFileContent(){return filecontent;} public void setFileContent(byte [] filecontent){this.filecontent = filecontent;}}}これにより、ObjectInputStreamとObjectOutputStreamのシリアル化により画像を伝播できます
上記の基本を理解した後、最初にUIインターフェイス設定、画像受信、およびコントロール側のキーボードおよびマウスアクション監視を完了する必要があります。
まず、受信画像を設定します。
public static void reveivepic()throws classNotFoundException、iOException {message g =(message)ois.readobject(); fileoutputStream fos = new fileoutputStream( "d:// out //"+g.getFileName()); fos.write(g.getfilecontent()、0、(int)g.getfilelength()); fos.flush(); fileInputStream fis = new FileInputStream( "d:// out //"+g.getFileName()); bufferedimage bi = imageio.read(fis); iic = new ImageIcon(bi);画像img = iic.getimage(); Toolkit tk = toolkit.getDefaultToolkit();ディメンションd = tk.getScreensize(); int w = d.width; int h = d.height; bufferedimage bi = resize(img、800,600); image_lab.seticon(new ImageIcon(bi)); IMG_LAB.REPAINT(); //前に描いた背景をピンドアウトしますint h = img.getheight(null); bufferedimage dimg = new bufferedimage(neww、newh、bufferedimage.type_int_bgr); graphics2d g = dimg.creategraphics(); g.setRenderingHint(renderinghints.key_interpolation、renderinghints.value_interpolation_bilinear); G.Drawimage(IMG、0、0、NewW、NewH、0、0、W、H、Null); g.dispose();ダミを返します。 }このように、ObjectInputStreamからメッセージクラスを受信した後、画像をパネルペインのサイズにリセットして表示できます
次のステップは、パネルプロパティとリスナーを設定することです。
public static void showui(){//コンソールタイトルjframe jf = new JFrame( "Console"); SetListener(JF); //コンソールサイズjf.setsize(500、400); // imag_labは、画像を保存するために使用されます。image_lab= new Jlabel(); jf.add(imag_lab); // setVisible(true); //コンソールトップjf.setalwaysontop(true); jf.SetSizable(true); jf.setDefaultCloseoperation(jframe.exit_on_close); }リスナー:
public static void setlistener(jframe frame){//パネルセットリスナーframe.addkeylistener(new keyadapter(){public void keypressed(keyevent e){sendeventobject(e);} @override public void keyRelease }); frame.AddMouseWheellistener(new MouseWheellistener(){public void mouseWheelMoved(MouseWheelevent e){sendeventObject(e);}}); frame.addmousemotionListener(new MousemotionListener(){public void mousedRagged(mouseEvent e){sendeventObject(e);} public void mousemoved(mousevent e){sendeventObject(e);}}); frame.addmouseListener(new Mouselistener(){public void mouseclicked(mousevent e){sendeventobject(e);} public void mouseEntered(mouseevent e){sendeventobject(e);} public void mouse exited(mousevent ebided(e); e){sendeventObject(e); } private static void sendeventObject(inputevent event){try {system.out.println( "send"); oos.writeobject(event); oos.flush(); } catch(例外EF){ef.printstacktrace(); }上記はコントロールエンドを完了します。
次に、制御された端を構築します:
制御された端は、ロボットを使用してスクリーンショットを撮影して送信する必要があります。最初に受信した入力ventに反応する方法を作成する必要があります。スクリーンショットと送信:
public static void capturepic()throws awtexception、ioexception {robot = new robot();メッセージmsg = null; Toolkit tk = java.awt.toolkit.getDefaultToolkit(); java.awt.dimension dm = tk.getscreensize(); java.awt.robot robot = new java.awt.robot(); for(int i = 0; i <50; i ++){//指定されたサイズ長方形の画面領域を挿入rec = new rectangle(0、0、(int)dm.getWidth()、(int)dm .getheigh()); bufferedimage bimage = robot.createscreencapture(rec); //画像をファイル文字列に保存しますfilepath = "d:// out // screenshot"+i+".jpeg"; fileoutputStream fops = new fileoutputStream(filepath); javax.imageio.imageio.write(bimage、 "jpeg"、fops); fops.flush(); fops.close(); msg = new Message(filepath); System.out.println(msg.getFileName()); System.out.println( "send"); oos.writeobject(msg); oos.flush(); }}このコードは、一時ファイルのストレージ場所としてd:/ out/ディレクトリを使用することに注意してください。読者は、このコードを使用する際に、一時的なドキュメントのストレージを自分で設定する必要があります。
次に、ロボットを実装して、受信した入力命令で動作します。
public void action()throws awtexception、classnotfoundexception、ioexception {robot robot = new robot(); while(true){inputevent e =(inputevent)ois.readobject(); if(e!= null){handleEvents(robot、e);}}} public static void handleevents(robot action、inputevent event){mousevent mevent = null; //マウスイベントMouseWheelevent MWevent = null; //マウススクロールイベントKeyEvent kevent = null; //キーボードイベントint mousebuttonmask = -100; // Mouse Key Switch(event.getId()){case mouseevent.mouse_moved:// mouse moveme mevent =(mousevent)event; action.mousemove(mevent.getx()、mevent.gety());壊す ; case mouseevent.mouse_pressed:// mouse key press mevent =(mousevent)event; action.mousemove(mevent.getx()、mevent.gety()); MouseButtonMask = getMouseClick(mevent.getButton()); if(mousebuttonmask!= -100)Action.MousePress(MouseButtonMask);壊す; case mouseEvent.Mouse_Released://マウスボタンMevent =(MouseEvent)イベントをリリースします。 action.mousemove(mevent.getx()、mevent.gety()); MouseButtonMask = getMouseClick(mevent.getButton()); //マウスボタンを取得します(MouseButtonMask!= -100)Action.MouserElease(MouseButtonMask);壊す ; case mouseevent.mouse_wheel:// mouse scroll mwevent =(mousewheelevent)event; Action.MouseWheel(mwevent.getWheelRotation());壊す ; Case MouseEvent.Mouse_Dragged:// Mouse Drag Mevent =(MouseEvent)Event; action.mousemove(mevent.getx()、mevent.gety());壊す ; case keyevent.key_pressed:// key kevent =(keyevent)イベント; action.keypress(kevent.getKeycode());壊す ; case keyevent.key_released:// solved key kevent =(keyevent)event; action.keyrelease(kevent.getkeycode());壊す ;デフォルト:break; }} private static int getMouseClick(int button){//マウスボタンを取得します(button == mouseevent.button1)//左キー、中央のキーはbutton2 return inputevent.button1_mask; if(button == mouseevent.button3)//右キー戻りinputevent.button3_mask; return -100; }プログラム全体がここで終了します。上記のプログラムは、ロボットのヒトスレッドのカプセル化を実装していません。使用できる完全なコードは、次のサイトリソースからダウンロードできます:http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(vevb.com).rar
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。