📄 clienttest.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 + -