📄 tcpmonitorserver.java
字号:
/*
* @(#)TcpMonitorServer.java 1.00 2005-9-4
*
* Copyright 2005 BeanSoft Studio. All rights reserved.
* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package studio.beansoft.remotecontrol.server;
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
import studio.beansoft.net.HttpParameterParser;
import studio.beansoft.remotecontrol.ConfigurationManager;
import studio.beansoft.util.logging.Logger;
import sun.net.NetworkServer;
import com.keypoint.PngEncoder;
import com.keypoint.PngEncoderB;
/**
* TcpMonitorServer holds a server that send server screen images to client,
* and do keyboard and mouse operations requested by the client.
*
* Chinese documents:
* TCP 监控服务器 发送服务器屏幕图像到客户端, 并根据客户机的请求进行鼠标和键盘操作.
*
* @author BeanSoft
* @version 1.00 2005-9-4
*/
public class TcpMonitorServer extends NetworkServer {
/** The robot object */
protected Robot robot;
/** Logger */
private static Logger logger = Logger.getLogger(TcpMonitorServer.class);
/**
*
*/
public TcpMonitorServer() {
try {
robot = new Robot();
} catch (AWTException e1) {
// TODO auto generated try-catch
e1.printStackTrace();
return;
}
try {
String portString = ConfigurationManager.getConfiguration().getProperty("server_port");
startServer(Integer.parseInt(portString));
System.out.println(getClass().getName() + " started at " + portString);
} catch (Exception e) {
// TODO auto generated try-catch
e.printStackTrace();
}
}
/**
* Service client as a TCP monitor server.
* @see studio.beansoft.remotecontrol.client.TcpCommunicationThread
*/
public void serviceRequest() throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(this.clientInput));
String line;
// Buffered output
BufferedOutputStream bufferout = new BufferedOutputStream(clientOutput,
10240);
byte[] imgData;// Produced image data
while((line = in.readLine()) != null) {
long startTime = System.currentTimeMillis();
doEventHandle(line);
// Keypoint png file output
PngEncoderB pngb = new PngEncoderB(captureScreen(),
PngEncoder.NO_ALPHA, 0, 9);
imgData = pngb.pngEncode();
bufferout.write(("length" + imgData.length + '\n').getBytes());
bufferout.write(imgData);
bufferout.flush();
logger.info("Execution time:" + (System.currentTimeMillis() - startTime));
startTime = System.currentTimeMillis();
}
}
/**
* Capture the current computer's screen to a image.
* @return
*/
public BufferedImage captureScreen() {
// determine current screen size
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
Rectangle screenRect = new Rectangle(screenSize);
// create screen shot
BufferedImage image = robot.createScreenCapture(screenRect);
return image;
}
/**
* Do event handles, such as mouse and keyboard events.
* @param parameters the request string with parameters
*/
public void doEventHandle(String parameters) {
Hashtable param = HttpParameterParser.parseURIParameters(parameters);
// Mouse events
String mouse_events = (String)param.get("mouse_events");
if(mouse_events != null && mouse_events.length() > 0) {
java.util.ArrayList list = studio.beansoft.remotecontrol.MouseEventCodec.stringToMouseEvent(mouse_events);
long startTime = 0;
for (int i = 0; i < list.size(); i++) {
java.awt.event.MouseEvent e = (java.awt.event.MouseEvent) list.get(i);
if(i == 0) {
startTime = e.getWhen();
}
// Move mouse to given position
robot.mouseMove(e.getX(), e.getY());
int buttonMask = java.awt.event.InputEvent.BUTTON1_MASK;// 鼠标按键的掩码
int button = e.getButton();// Mouse buttons , @since JDK 1.4
// Change button mask
switch (button) {
case MouseEvent.BUTTON1:
buttonMask = java.awt.event.InputEvent.BUTTON1_MASK;
break;
case MouseEvent.BUTTON2:
buttonMask = java.awt.event.InputEvent.BUTTON2_MASK;
break;
case MouseEvent.BUTTON3:
buttonMask = java.awt.event.InputEvent.BUTTON3_MASK;
break;
default:
break;
}
if(e.getID() == MouseEvent.MOUSE_PRESSED) {
// System.out.println("Press at " + e.getX() + "," + e.getY());
robot.mousePress(buttonMask);
} else if(e.getID() == MouseEvent.MOUSE_RELEASED) {
// System.out.println("Realease at " + e.getX() + "," + e.getY());
robot.mouseRelease(buttonMask);
}
robot.delay(10);
// Pause some time
//robot.delay((int)(e.getWhen() - startTime));
// System.out.println("Delayed " + (e.getWhen() - startTime) + "ms");
startTime = e.getWhen();
}
}
// Key board events
String key_events = (String)param.get("key_events");
if(key_events != null && key_events.length() > 0) {
java.util.ArrayList list = studio.beansoft.remotecontrol.KeyEventCodec.stringToKeyEvent(key_events);
long startTime = 0;
for (int i = 0; i < list.size(); i++) {
java.awt.event.KeyEvent e = (java.awt.event.KeyEvent) list.get(i);
if(i == 0) {
startTime = e.getWhen();
}
if(e.getID() == KeyEvent.KEY_PRESSED) {
// System.out.println("Press at " + e.getX() + "," + e.getY());
robot.keyPress(e.getKeyCode());
} else if(e.getID() == KeyEvent.KEY_RELEASED) {
// System.out.println("Realease at " + e.getX() + "," + e.getY());
robot.keyRelease(e.getKeyCode());
}
robot.delay(10);
// Pause some time
//robot.delay((int)(e.getWhen() - startTime));
// System.out.println("Delayed " + (e.getWhen() - startTime) + "ms");
startTime = e.getWhen();
}
}
}
/**
* Running the TCP server.
* @param args
*/
public static void main(String[] args) {
new TcpMonitorServer();
}
/**
* @return returns the robot object.
*/
public Robot getRobot() {
return robot;
}
/**
* @param robot The robot object to set.
*/
public void setRobot(Robot robot) {
this.robot = robot;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -