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 + -
显示快捷键?