clienttest.java

来自「java写的远程屏幕控制系统,在linux和window之间实现了远程互相控制,」· Java 代码 · 共 372 行

JAVA
372
字号
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.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 


 
 
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; 

           
/////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; 
           socket=new DatagramSocket(5000); 
           socket.setReceiveBufferSize(409600); 
           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()); } 
           } 
         });
  

//////鼠标移动监听
      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());  } 
      });
      
      this.addMouseWheelListener(new MouseWheelListener(){ 
   public void mouseWheelMoved(MouseWheelEvent e) { 
    sendMouse(MouseEvent.MOUSE_WHEEL,e.getX(),e.getY(),e.getUnitsToScroll()); 
   } 
  }); 

   }  //end clienttest

////发送键盘信息 方法
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,ServerTest.PORT); 
   socket.send(packet); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 //////发送鼠标信息 方法
 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 { //System.out.println("mousesend");
        DatagramPacket packetmouse=new DatagramPacket(bytes,bytes.length,server,5000); 
        socket.send(packetmouse); 
      } 
  catch (Exception e)
   { 
      e.printStackTrace(); 
   } 
 } 

 
 
 //3。显示图象函数
       private void getScreen(InputStream input) 
	 { 
      try{ 
          JPEGImageDecoder decoder=JPEGCodec.createJPEGDecoder(input); 
          BufferedImage image=decoder.decodeAsBufferedImage(); 
          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 { // String s="ok";  
				//	byte[] xxx=s.getBytes();
					//DatagramPacket packetxxx=new DatagramPacket(xxx,xxx.length,server,5000); ; 
                     // socket.send(packetxxx); 
					
				  	
					
					DatagramPacket packet=new DatagramPacket(bytes,bytes.length); 
                     socket.receive(packet); 
                     ByteArrayInputStream input=new ByteArrayInputStream(packet.getData(),packet.getOffset(),packet.getLength()); 
                     getScreen(input); 
                         }//try 
			        catch (Exception e) 
					     {/* try { Thread.sleep(100); }
				          catch (Exception ex) {}*/ 
                         } 
             }//endwhile 
     }//endrun 
 
 //5。CLOSE函数
 public void close() {  ended=true; System.exit(0); } 
 
 
 //6。MAIN函数
 public static void main(String[] args) 
	 { ClientTest one=null; 
         
		 /////////6。1输入IP窗体/////////
		  JFrame ip=new JFrame("请输入IP:"); 
              ip.getContentPane().setLayout(new BorderLayout()); 
              ip.setSize(240,80); 
              JButton exit=new JButton("确定"); 
			  JTextField text=new JTextField();
			   ip.getContentPane().add(text,BorderLayout.SOUTH); 
              ip.getContentPane().add(exit,BorderLayout.CENTER); 
               Dimension screen1=Toolkit.getDefaultToolkit().getScreenSize(); 
               Dimension a1=ip.getSize(); 
               ip.setLocation((screen1.width-a1.width)/2,(screen1.height-a1.height)/2); 
              

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

		////////6.3显示图象窗口////////
			 try { 
               UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //interface
               
		       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); 
               
		      ////////6.3.1事例化类&启动线程
               one=new ClientTest(s); 
               new Thread(one).start(); 
               final ClientTest the=one; 
               
			   JScrollPane scroll=new JScrollPane(one); 
               frame.getContentPane().add(scroll,BorderLayout.CENTER); 
               
			   //////6.3.2显示图象窗口--窗口关闭的监听
			   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*/
    }//endmain
 

	  
} //end class

⌨️ 快捷键说明

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