⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clienttest.java

📁 Java编写的远程控制软件
💻 JAVA
字号:
/****************************************
* 程序文件名称:  ClientTest.java
*  功能:    客户端应用程序    
*****************************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 
import java.awt.AWTEvent; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.event.AWTEventListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.MouseWheelEvent; 
import java.awt.event.MouseWheelListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuItem; 
import javax.swing.JOptionPane; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 
import javax.swing.SwingConstants; 
import javax.swing.UIManager; 
import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageDecoder; 
import java.util.zip.*;
import java.awt.image.*;
import java.io.*;
import com.sun.image.codec.jpeg.*;
public class ClientTest extends JLabel implements Runnable//,Scrollable
{ 
private DatagramSocket socket; 
    private boolean ended; 
	private long delay=1000; 
    private InetAddress server; 
    private BufferedImage image; 
    public static  String s="";
	final private JPopupMenu menu; 
    int[] pixels3,pixels4;      
/*  1. 显示图像	*/   
public void paint(Graphics g) 
{ 
    super.paint(g); 
    if(image!=null) {g.drawImage(image,0,0,this);} 
   } 
 
  /*  2.构造方法	*/
  public ClientTest(String ip) throws Exception 
  {
   super(); 
   image=null; 
   ended=false; 
   //设置UDP数据报端口
   socket=new DatagramSocket(5000); 
   //设置存放接收数据缓冲区的大小
   socket.setReceiveBufferSize(409600); 
   //存放被控端IP地址
   server=InetAddress.getLocalHost(); 
   //定义向被控端发出截取屏幕图像指令的线程
   new Thread(new Runnable() 
	{
     public void run() 
	  {
       DatagramPacket packetsign=new 
                   DatagramPacket("REFRESH             ".getBytes(),20); 
       while(!ended) { 
         try {
           packetsign.setAddress(server); 
           packetsign.setPort(5000); 
           socket.send(packetsign); 
           Thread.sleep(delay); 
           }
	     catch (Exception e)  { 
           try { Thread.sleep(100); } 
           catch (Exception ex) { }
           } 
         }         //end while
      }            //end run
    }).start(); 
  //定义弹出式菜单
  menu=new JPopupMenu(); 
  JMenuItem target=new JMenuItem("监控目的地址");
  final JLabel one=this; 
  this.setPreferredSize(new Dimension(640,480)); 
  InetAddress address=InetAddress.getByName(ip); 
  server=address; 
  menu.add(target);
  /*  设置鼠标按键监听   */
  this.addMouseListener(new MouseListener(){
  public void mouseClicked(MouseEvent e) { process(e);} 
  public void mouseEntered(MouseEvent e) { process(e);} 
  public void mouseExited(MouseEvent e) { process(e); } 
  //点击鼠标按键
  public void mousePressed(MouseEvent e) 
  {  
    process(e); 
    sendMouse(MouseEvent.MOUSE_PRESSED,e.getX(),e.getY(),e.getButton()); 
  } 
  //释放鼠标按键
  public void mouseReleased(MouseEvent e)
  {
    process(e); 
    sendMouse(MouseEvent.MOUSE_RELEASED,e.getX(),e.getY(),e.getButton()); 
  } 
  //侦测鼠标的坐标位置
  private void process(MouseEvent e) 
  {  if(e.isPopupTrigger()) { 
         menu.show(one,e.getX(),e.getY());
       } 
     } 
  });   /*  end addMouseListener( ) */

  /*  设置鼠标移动监听  */
  this.addMouseMotionListener(new MouseMotionListener(){
   public void mouseDragged(MouseEvent e) {  
      sendMouse(MouseEvent.MOUSE_MOVED,e.getX(),e.getY(),e.getButton()); 
     }   
    
   public void mouseMoved(MouseEvent e) {
      sendMouse(MouseEvent.MOUSE_MOVED,e.getX(),e.getY(),e.getButton()); 
     } 
  });  /*  end addMouseMotionListener( ) */
      
    /*  设置鼠标滚轮监听  */
  this.addMouseWheelListener(new MouseWheelListener(){ 
   public void mouseWheelMoved(MouseWheelEvent e) { 
    sendMouse(MouseEvent.MOUSE_WHEEL,e.getX(),e.getY(),e.getUnitsToScroll()); 
   } 
  });  /*  end addMouseWheelListener( ) */

 }  /*  构造方法 ClientInit( ) 结束 */

 /*  发送键盘信息方法    */
 private void sendKey(int type,int code,char c,int location) { 
  byte[] bytes=new byte[50]; 
  for(int i=0;i<bytes.length;i++) { 
     bytes[i]=' '; 
   } 
  String command; 
  if(type==KeyEvent.KEY_PRESSED) { 
     command="KeyPressed"; 
   } 
  else if(type==KeyEvent.KEY_RELEASED) { 
     command="KeyReleased"; 
   }
 else { 
     command=""; 
   } 
  byte[] the=command.getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[i]=the[i]; 
  } 
  the=String.valueOf(code).getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[20+i]=the[i]; 
  } 
  the=String.valueOf(Character.getNumericValue(c)).getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[30+i]=the[i]; 
  } 
  the=String.valueOf(location).getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[40+i]=the[i]; 
  } 
  try { 
  DatagramPacket packet=new DatagramPacket(bytes,bytes.length,server,5000); 
   socket.send(packet); 
  } 
catch (Exception e) { 
   e.printStackTrace(); 
  } 
 }    /*  end sendKey   */
 
 /*  发送鼠标事件信息方法   */
private void sendMouse(int type,int x,int y,int button)
{ 
byte[] bytes=new byte[50]; 
  for(int i=0;i<bytes.length;i++) { 
bytes[i]=' ';
} 
  String command; 
  if(type==MouseEvent.MOUSE_PRESSED) 
       { command="MousePressed"; }
  else if(type==MouseEvent.MOUSE_RELEASED) 
       { command="MouseReleased"; } 
  else if(type==MouseEvent.MOUSE_MOVED)
       { command="MouseMoved"; }
  else if(type==MouseEvent.MOUSE_WHEEL)
  { 
   command="MouseWheel"; 
  } 
  else {command=""; } 
  
  if(button==MouseEvent.BUTTON1) 
     { 
       button=MouseEvent.BUTTON1_MASK; 
     } 
  else if(button==MouseEvent.BUTTON2) 
     { 
       button=MouseEvent.BUTTON2_MASK; 
     } 
  else if(button==MouseEvent.BUTTON3) 
     { 
       button=MouseEvent.BUTTON3_MASK; 
     } 

  byte[] the=command.getBytes(); 
  for(int i=0;i<the.length;i++) 
     {bytes[i]=the[i]; } 
  
  the=String.valueOf(x).getBytes(); 
  
  for(int i=0;i<the.length;i++) { 
   bytes[20+i]=the[i]; 
  } 
  the=String.valueOf(y).getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[30+i]=the[i]; 
  } 
  the=String.valueOf(button).getBytes(); 
  for(int i=0;i<the.length;i++) { 
   bytes[40+i]=the[i]; 
  } 
  try { 
        DatagramPacket packetmouse=new
 DatagramPacket(bytes,bytes.length,server,5000); 
        socket.send(packetmouse); 
      } 
  catch (Exception e)
   { 
      e.printStackTrace(); 
   } 
 }     /*  end sendMouse( )  */

 
 
 /*  3.将接收到的屏幕图象数据进行解压,还原成图像  */
       public void getScreen(byte[] bytes1) 
	 { 
     
      
      try{
      	  int x;
      	  int width=1024;
      int height=768;
      pixels3=new int[1024*768];
          //JPEGImageDecoder decoder=JPEGCodec.createJPEGDecoder(input); 
          int[] pixels3=bytes2ints(bytes1);
          if(pixels4 != null ){
            System.out.println("pixels4不为空");
            //int compare2;
            //ColorModel cm=ColorModel.getRGBdefault();
            //for(x=0;x<10000;x++){
            	//System.out.print("pixels3[x]=" + pixels3[x]);
            //}
         	for(x=0;x<=width*height-1;x++){//width*height-1 ,(width-1)*(height-1)
         		//compare2=pixels3[x] ^ pixels4[x];
         		//int alpha1=cm.getRed(pixels3[x]);
         		//System.out.print("alpha1=" + alpha1);
         		if ( pixels3[x] != 0){//找出相异部分
         			pixels4[x] =pixels3[x];
         		}
         	}	
         }
         //(否则给pixels4赋值)
         else{
         	System.out.println("pixels4为空");
         	pixels4= new int[width*height];
         	
         	for(x=0;x<=width*height-1;x++){
         	
         			pixels4[x] = pixels3[x];
         		    //pixels3[x] = pixels1[x];
         	}
         }
          BufferedImage image=new BufferedImage(1024,768,BufferedImage.TYPE_INT_RGB); 
          image.setRGB(0,0,1024,768,pixels3,0,768); 
          try{//Image io.write(image,"JPEG", file1);
         File file=new File("hehe1.jpg");                                                                                                  
         FileOutputStream fileoutput=new FileOutputStream(file);
         OutputStream f = new FileOutputStream(file);
         JPEGImageEncoder encoder1 = JPEGCodec.createJPEGEncoder(f);
         encoder1.encode(image);
         f.close(); 



         } catch(IOException aaa){     } 
          this.image=image ;
          this.setPreferredSize(new Dimension(image.getWidth(),image.getHeight())); 
          this.updateUI(); 
         }
	  catch (Exception e) {e.printStackTrace();} 
     }

/* 4.线程RUN(),接收传来的屏幕图像数据  */
public void run() 
{ 
  byte[] bytes=new byte[409600]; 
  while(!ended) 
  { 
   try { 
	DatagramPacket packet=new DatagramPacket(bytes,bytes.length); 
    socket.receive(packet); 
    ByteArrayInputStream input= new ByteArrayInputStream(
    packet.getData(),packet.getOffset(),packet.getLength()); 
                     //添加
                    
                        GZIPInputStream gzin=new GZIPInputStream(input);    //得到压缩输入流
                        //gzin.read(bytecs,0,bytecs.length) ;
                        byte[] buf1=new byte[3145728]; //缓冲区大小
                        //int num;
                       //while ((num=gzin.read(buf1,0,buf1.length))!=-1) 
                        //{ //如果文件未读完
                           //fout.write(buf1,0,num);   //写入缓冲数据到输出流
                          // System.out.printf("num=" + num);
                        //}
                        
                        gzin.read(buf1,0,buf1.length) ;
                       //System.out.printf("num=" + num);
                       gzin.close();    //关闭压缩输入流
                     
                       getScreen(packet.getData()); 
                     //添加
    //getScreen(input); 
	}    //try end 
  catch (Exception e)  {         } 
}//end while 
}//end run 
 
 /*  5.CLOSE方法  */
 public void close() 
{ 
ended=true; 
System.exit(0); 
} 
/*  添加方法  */
 //*byte[] to int[]
   public static int[] bytes2ints(byte[] bytebuf1)
  {  
      int len=bytebuf1.length;
      int len4=len/4;
      //System.out.print("len4=" + len4 + "\n");
      int[] ints=new int[len4];
      byte[] bytebuf2=new byte[4];
      for(int i=0;i<len4;i++){
      	
      	for(int y=0;y<4;y++){
      	bytebuf2[y]=bytebuf1[i*4+y];	
        }
      ints[i]=ByteToInt(bytebuf2);
      
      }
      return ints ;
  } 
 //*byte to int
   public static int ByteToInt(byte[] bytebuf)
{
byte[] buf=new byte[4];
int len=4,i=0;
int nTemp=0,nValue=0;
if(bytebuf.length<len){
len=bytebuf.length;
}
if(len==0){
return -1;
}
for(i=0;i<len;i++){
buf[i]=bytebuf[i];
}
for(i=0;i<4;i++){
nTemp=(int)buf[i];
if(nTemp<0){
nTemp=256+nTemp;
}
//System.out.println(nTemp);
nTemp=nTemp<<(8*i);
nValue=nValue+nTemp;
}
return nValue;
}

 /* 6.MAIN方法  */
 public static void main(String[] args) 
{ ClientTest one=null; 
         
	  /*  建立输入IP地址信息窗体ipwin  */
	  JFrame ipwin=new JFrame("请输入IP:"); 
      ipwin.getContentPane().setLayout(new BorderLayout()); 
      ipwin.setSize(240,80); 
      JButton exit=new JButton("确定"); 
	  JTextField text=new JTextField();
	  ipwin.getContentPane().add(text,BorderLayout.SOUTH); 
      ipwin.getContentPane().add(exit,BorderLayout.CENTER); 
      Dimension screen1=Toolkit.getDefaultToolkit().getScreenSize(); 
      Dimension a1=ipwin.getSize(); 
      ipwin.setLocation((screen1.width-a1.width)/2,(screen1.height-a1.height)/2); 

	 final JFrame xxx=ipwin; 
	 final JTextField yyy=text;
			   
	/* 输入IP地址窗体--退出键的监听  */
    exit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) {
          String aaa=yyy.getText();
          s=aaa;
	      xxx.setVisible(false); 
          } 
       }); 
			  
	 /*   输入IP地址窗体--窗口关闭的监听  */ 
	ipwin.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) {
        System.exit(0);
       } 
    }); 
    ipwin.setVisible(true);
	/*  判断   */	  
	while(s==""){  }
	System.out.println(s);

	/*  显示图象窗口  */
  try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     JFrame frame=new JFrame("监视中。。。"); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     Dimension screen=Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setSize(640,480); 
     Dimension thesize=frame.getSize(); 
     frame.setLocation((screen.width-thesize.width)/2,
                     (screen.height-thesize.height)/2); 
	/*   实例化启动线程  */
    one=new ClientTest(s); 
    new Thread(one).start(); 
    final ClientTest the=one; 
    JScrollPane scroll=new JScrollPane(one); 
    frame.getContentPane().add(scroll,BorderLayout.CENTER); 
               
	/*  显示图象窗口--窗口关闭的监听  */
	frame.addWindowListener(new WindowAdapter(){
	   public void windowClosing(WindowEvent e) {
          the.close(); System.exit(0);
       } 
     }); 
                
     /*   对被控端显示窗口的键盘进行监听    */
   Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener(){
     public void eventDispatched(AWTEvent event) {
       KeyEvent e=(KeyEvent)event; 
       if(e.getID()==KeyEvent.KEY_PRESSED) {
         the.sendKey(KeyEvent.KEY_PRESSED,e.getKeyCode(),
                     e.getKeyChar(),e.getKeyLocation()); 
        }
      else if(e.getID()==KeyEvent.KEY_RELEASED) {
         the.sendKey(KeyEvent.KEY_RELEASED,e.getKeyCode(),
                     e.getKeyChar(),e.getKeyLocation()); 
        } 
      } 
   },AWTEvent.KEY_EVENT_MASK); 
   frame.setVisible(true); 
  }//end try
 catch (Exception e) {
 	 e.printStackTrace(); 
     if(one!=null) {one.close();} 
	 System.exit(0); 
  }     /* end catch  */
 }  /*   end   main    */
 	  
}  /*    end class    */


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -