Java는 원격 제어 기술을 구현합니다
Java와 함께 제공되는 Java.net 과 Java.awt.robot. 의 혼합은 원격 컴퓨터 마우스의 움직임 및 키보드의 입력을 제어하는 등 네트워크를 통해 다른 컴퓨터의 원격 제어를 실현하고 실시간으로 원격 컴퓨터 화면의 이미지를 얻는 데 사용될 수 있습니다. 이 기사는이 기술을 마스터하는 방법을 가르쳐주기 위해 얕은 언어와 논리를 사용하여 간결한 언어와 논리를 사용합니다.
먼저 렌더링을 살펴 보겠습니다.
원격 컴퓨터 인터페이스 :
터미널 컴퓨터 인터페이스 제어 :
제어 단자 입력 :
원격 입력 :
원격 제어의 기술 아이디어에 대한 자세한 소개부터 시작하겠습니다.
먼저 두 컴퓨터는 java.net의 소켓을 통해 연결됩니다.
먼저 한쪽 끝에 서사 소켓을 열고 다른 쪽 끝과 소켓으로 연결하십시오.
서버 측
서버 소켓을 설정하고 필요한 입력 및 출력 스트림이 초기화됩니다.
public static void openserver ()는 ioexception, classNotFoundException {System.out.println ( "ServerStart ......")을 던졌습니다. Serversocket Server = New Serversocket (7777); socket = server.accept (); System.out.println ( "연결 .../n"+소켓); OIS = new ObjectInputStream (socket.getInputStream ()); OOS = 새로운 ObjectOutputStream (socket.getOutputStream ()); }클라이언트 측 <br /> 소켓을 사용하여 서버에 연결하고 입력 및 출력 스트림을 초기화해야합니다.
공개 정적 무효 STARTCONNECTION (String IP, Int Port)은 알 수없는 hostException, ioException, awtexception {Socket = New Socket ( "192.168.0.106", 7777); if (socket.isconnected ()) {system.out.println ( "소켓 연결 ..."+소켓); } oos = 새 objectOutputStream (socket.getOutputStream ()); OIS = new ObjectInputStream (socket.getInputStream ()); }이런 식으로 두 컴퓨터는 함께 연결되고 스트림 (InputStream 및 OutputStream)을 통해 데이터를 교환 할 수 있습니다.
다음으로 두 컴퓨터가 원격 제어를 교환 해야하는 정보에 대해 생각할 수 있습니까? 먼저, 제어 끝은 스크린 이미지를 제어 끝에 지속적으로 제공해야합니다 (이것은 Java.awt.robot을 사용하여 구현 될 것입니다). 그런 다음 마우스와 키보드는 제어 끝 (로봇을 사용하여 구현)에 의해 전송 된 이벤트 (Inputevent)를 기반으로 동일한 작업을 수행합니다. 그런 다음 컨트롤 엔드는 먼저 제어 끝에 의해 전송 된 이미지를 수신하고 패널 (창)에 반사 한 다음 기기의 키보드와 마우스의 동작을 모니터링 한 다음 제어 된 끝의 호스트로 전달해야합니다 (패널 창에서 리스너를 설정하여 수행 할 수 있습니다).
여기서 발생하는 한 가지 문제는 전송에 사용 된 이미지가 이미지를 사용하든 BufferedImage를 사용하든 직렬화 할 수 없다는 것입니다. 따라서 I/Ostream은 전송에 사용할 수 없습니다. 따라서이 문제를 해결하려면 클래스에서 이미지 데이터를 캡슐화하고 다음과 같이 직렬화 가능한 인터페이스 이미지 클래스를 구현해야합니다.
import java.io.file; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioexception; import java.io.serializable; 공개 클래스 메시지 구현 {private static final long serialversionuid = 1L; 개인 문자열 파일 이름; // 파일 이름 프라이빗 Long FilElength; // 파일 길이 개인 바이트 [] filecontent; // file content public message () {} public message (string filepath)는 ioexception {file file = new File (FilePath); this.filelength = file.length (); this.filename = file.getName (); fileInputStream fis = 새로운 fileInputStream (FilePath); 바이트 [] bytes = 새로운 바이트 [(int) filelengrength]; fis.read (바이트, 0, (int) filelengrength); this.filecontent = 바이트; } 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 = fielecontent;}}이를 통해 ObjectInputStream 및 ObjectOutputStream의 직렬화를 통해 이미지를 전파 할 수 있습니다.
위의 기본 사항을 이해 한 후 먼저 제어 측면의 UI 인터페이스 설정, 이미지 수신 및 키보드 및 마우스 액션 모니터링을 완료해야합니다.
먼저 수신 사진을 설정하십시오.
public static void ReveivePic ()는 classNotFoundException, ioException {message g = (메시지) 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 = 새로운 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 (); // 이전에 그린 배경을 제거} 개인 정적 완충 시민 resize (image img, int neww, int newh) {int w = img.getWidth (null); int h = img.getheight (null); BufferedImage dimg = new bufferedImage (Neww, Newh, BufferedImage.type_int_bgr); 그래픽 2d 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 (); 리턴 Dimg; }이러한 방식으로 ObjectInputStream에서 메시지 클래스를 수신 한 후 이미지를 패널 창의 크기로 재설정하여 표시 할 수 있습니다.
다음 단계는 패널 속성 및 청취자를 설정하는 것입니다.
public static void showui () {// 콘솔 제목 jframe jf = new Jframe ( "콘솔"); setListener (JF); // 콘솔 크기 jf.setsize (500, 400); // imag_lab은 사진을 저장하는 데 사용됩니다. imag_lab = new jlabel (); jf.add (imag_lab); // setVisible (true); // 콘솔 상단 jf.setalwaysontop (true); jf.setResizable (true); JF.SetDefaultCloseOperation (jframe.exit_on_close); }경청자:
public static void setListener (jframe frame) {// 패널 세트 리스너 프레임 .addkeyAdapter () {public void keyPressed (keyEvent e) {sendEventObject (e);} @Override public keyreleased (keyevent e) {sendEventObject (e); }); 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 (mouseevent e) {sendeventObject (e);}); frame.addmouselistener (new mouselistener () {public void mouseclicked (mouseevent e) {sendeventobject (e);} public void mouseentered (mouseevent e) {} public void mouseexed (mouseevent e) {voideventoped (e);}; e) {sendeventObject (e); } private static void sendEventObject (inputevent event) {try {system.out.println ( "send"); oos.writeobject (이벤트); oos.flush (); } catch (예외 ef) {ef.printstacktrace (); }위의 내용은 제어 끝을 완료합니다.
다음으로 제어 된 끝을 구축 할 것입니다.
제어 된 엔드는 로봇을 사용하여 스크린 샷을 찍고 보내야하며, 수신 된 inputevent에 반응하는 메소드를 먼저 작성해야합니다. 스크린 샷을 보냅니다.
public static void capturepic ()는 awtexception, ioexception {robot = new robot (); 메시지 msg = null; 툴킷 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 .getheight ()); BufferedImage bimage = robot.createscreencapture (rec); // 이미지를 파일에 저장 문자열 filepath = "d : // out // 스크린 샷"+i+".jpeg"; fileoutputStream fops = 새 FileOutputStream (FilePath); javax.imageio.imageio.write (bimage, "jpeg", fops); fops.flush (); fops.close (); msg = 새 메시지 (filepath); System.out.println (msg.getfilename ()); System.out.println ( "Send"); oos.writeobject (msg); oos.flush (); }}이 코드는 D :/ Out/ Directory를 임시 파일의 저장 장소로 사용합니다. 독자는이 코드를 사용할 때 스스로 임시 문서의 저장을 설정해야합니다.
그런 다음 수신 된 입자 명령에서 작동 할 로봇을 구현하십시오.
public void action ()는 awtexception, classNotFoundException, ioException {robot robot = new Robot (); while (true) {inputevent e = (inputevent) ois.readobject (); if (e! = null) {handleEvents (Robot, e);}}} public static void handevents (로봇 조치, Inputevent 이벤트) {mouseevent mevent = null; // 마우스 이벤트 mousewheelevent mwevent = null; // 마우스 스크롤 이벤트 keyEvent kevent = null; // 키보드 이벤트 int MouseButtonMask = -100; // 마우스 키 스위치 (event.getId ()) {case mouseevent.mouse_moved : // mouse movement = (mouseevent) 이벤트; action.mouseMove (mevent.getx (), mevent.gety ()); 부서지다 ; case mouseevent.mouse_pressed : // 마우스 키 프레스 mevent = (mouseevent) 이벤트; action.mouseMove (mevent.getx (), mevent.gety ()); MouseButtonmask = getMouseClick (mevent.getButton ()); if (mousebuttonmask! = -100) action.mousepress (mousebuttonmask); 부서지다; case mouseevent.mouse_Relered : // 마우스 버튼 릴리스 mevent = (mouseevent) 이벤트; action.mouseMove (mevent.getx (), mevent.gety ()); MouseButtonmask = getMouseClick (mevent.getButton ()); // 마우스 버튼을 가져옵니다. 부서지다 ; case mouseevent.mouse_wheel : // 마우스 스크롤 mwevent = (mousewheelevent) 이벤트; action.mousewheel (mwevent.getwheelRotation ()); 부서지다 ; case mouseevent.mouse_dragged : // mouse drag mevent = (mouseevent) 이벤트; action.mouseMove (mevent.getx (), mevent.gety ()); 부서지다 ; case keyEvent.key_pressed : // key kevent = (keyevent) 이벤트; action.keypress (kevent.getKeyCode ()); 부서지다 ; case keyEvent.key_Relered : // suleved key kevent = (keyevent) 이벤트; action.keyRelease (kevent.getKeyCode ()); 부서지다 ; 기본값 : 브레이크; }} private static int getMouseClick (int button) {// 마우스 버튼을 가져옵니다. if (button == mouseevent.button3) // 오른쪽 키 리턴 inputevent.button3_mask; 반품 -100; }전체 프로그램이 여기서 끝납니다. 위의 프로그램은 로봇 인간 실의 캡슐화를 구현하지 않습니다. 사용할 수있는 전체 코드는 다음 사이트 리소스에서 다운로드 할 수 있습니다. http://xiazai.vevb.com/201608/yuanma/java-romotecontrol(Vevb.com).rar
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.