📄 ajaxvncserver.java
字号:
/*
* AjaxVNCServer.java
*
* Created on May 21, 2007, 4:21 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package hk.haha.onet.ajaxvnc;
import hk.haha.onet.miniohttpd.*;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.File;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.*;
import java.util.concurrent.ThreadPoolExecutor;
/**
*
* @author heic
*/
public class AjaxVNCServer extends MinioHttpd{
private static final String TILEEXT = "JPG";
private KVMManager kvmman;
private TileManager tileman;
private ScreenScanner scanner;
private SessionManager sesman;
/** Creates a new instance of AjaxVNCServer */
public AjaxVNCServer(int port) {
super(port);
kvmman = new KVMManager();
tileman = new TileManager();
sesman = new SessionManager();
scanner = new ScreenScanner(kvmman, tileman, sesman);
scanner.startScreenScanning();
}
// return a new Handler object
protected MinioHandler newHandler(ThreadPoolExecutor pool_, SocketChannel channel_) throws IOException {
return new HttpHandler(pool_, channel_);
}
class HttpHandler extends MinioHandler
{
public HttpHandler(ThreadPoolExecutor pool_, SocketChannel channel_) throws IOException {
super(pool_, channel_);
}
public String ReadFileToString(String fn)
{
byte b[] = null;
try {
FileInputStream fis = new FileInputStream(fn);
int x= fis.available();
b= new byte[x];
fis.read(b);
}
catch (Exception e)
{
System.out.println("Error in reading "+fn);
return "";
}
String content = new String(b);
return content;
}
public void serve() {
String path = getRequest().getURI().getPath();
MinioResponse response = getResponse();
MinioRequest request = getRequest();
log(path);
try {
if (path.equals("/")) {
response.redirect("/index.htm");
}
else if (path.equals("/index.htm")) {
String text = ReadFileToString("index.htm");
String sid = sesman.createSession(getChannel().socket().getInetAddress()+"");
response.message(HTTP_OK, text.replace("\\[SESSION_ID\\]", sid));
}
else if (path.equals("/getScnUpdate")) {
String SessionId = request.getParam("sid");
StringBuffer sb = new StringBuffer();
Integer version = null;
String Key = null;
Random r = new Random( System.currentTimeMillis());
for (int i=0; i<tileman.getNumXTile(); i++) {
for (int j=0; j<tileman.getNumYTile(); j++) {
if (sesman.getSession(SessionId).isTileDirty(i,j)) {
sb.append("document.getElementById('i");
sb.append(i+"_"+j);
sb.append("').src='getTile?sid=");
sb.append(SessionId);
sb.append("&x=");
sb.append(i);
sb.append("&y=");
sb.append(j);
sb.append("&c=");
sb.append(r.nextInt(100000000));
sb.append("';");
}
}
}
response.message(HTTP_OK, sb.toString());
}
else if (path.equals("/sendKey")) {
String SessionId = request.getParam("sid");
kvmman.keyStroke(Integer.parseInt(request.getParam("key")));
response.message(HTTP_OK, "");
}
else if (path.equals("/sendMouse")) {
String sid = request.getParam("sid");
int x = Integer.parseInt(request.getParam("x"));
int y = Integer.parseInt(request.getParam("y"));
String act = request.getParam("act");
int button = Integer.parseInt(request.getParam("button"));
System.out.println("Mouse pos = ("+x+","+y+")");
kvmman.mouseMove(x, y);
System.out.println("Mouse act = " + act);
if (act.equals("press")) {
System.out.println("Mouse press = " + button);
kvmman.mousePress(button);
}
if (act.equals("release")) {
System.out.println("Mouse release = " + button);
kvmman.mouseRelease(button);
}
if (act.equals("click")) {
System.out.println("Mouse click = " + button);
kvmman.mouseStroke(button);
}
if (act.equals("dblclick")) {
System.out.println("Mouse dblclick = " + button);
kvmman.mouseStroke(button);
kvmman.mouseStroke(button);
}
response.message(HTTP_OK, "");
}
else if (path.equals("/getTile")) {
String sid = request.getParam("sid");
VNCSession ses = sesman.getSession(sid);
int x = Integer.parseInt(request.getParam("x"));
int y = Integer.parseInt(request.getParam("y"));
Tile tile = tileman.getTile(x, y);
synchronized (tile) {
String mimeType = "image/" + TILEEXT;
if (tile==null) return;
ses.clearTileDirty(x, y);
ByteArrayInputStream data = new ByteArrayInputStream(tile.getData());
response.dataStream(HTTP_OK, mimeType, data, 0);
}
}
else if (path.equals("/remotedesktop.html")) {
String sid = sesman.createSession(getChannel().socket().getInetAddress()+"");
String mimeType = "text/html";
StringBuffer sb = new StringBuffer();
sb.append("<table cellspacing='0' cellpadding='0'>");
for (int y = 0; y < tileman.getNumYTile(); y++) {
sb.append("<tr>\n");
for (int x = 0; x < tileman.getNumXTile(); x++) {
sb.append("<td>");
sb.append("<img src='getTile?sid=");
sb.append(sid);
sb.append("&x=");
sb.append(x);
sb.append("&y=");
sb.append(y);
sb.append("&c=");
sb.append(0);
sb.append("' id='i");
sb.append(x+"_"+y);
sb.append("' height='"+tileman.getTile(x,y).getHeight() +"' width='"+tileman.getTile(x,y).getWidth()+"' ></td>\n");
}
sb.append("</tr>");
}
sb.append("</table>");
String text = ReadFileToString("remotedesktop.html");
text = text.replaceFirst("<DYNAMICTEXT>", sb.toString());
text = text.replaceFirst("<TIMEOUT>", Integer.toString(500));
response.message(HTTP_OK, "text/html", text.replaceFirst("<SESSION>", sid));
}
else if (path.equals("/kmtest.htm")) {
serveFile(new File("."), false);
}
else if (path.equals("/ajaxvnc.js")) {
serveFile(new File("."), false);
}
else if (path.equals("/md5.js")) {
serveFile(new File("."), false);
}
else if (path.equals("/ajaxvnc.htm")) {
serveFile(new File("."), false);
}
else {
response.exception(HTTP_NOTFOUND, path + " not found");
}
}
catch (Exception e) {
log(WARN, path + " not found");
}
}
}
public static void main(String args[]) {
try {
Config.load("ajaxvnc.ini");
AjaxVNCServer a = new AjaxVNCServer(Config.http_port);
a.start();
a.setLogLevel(101);
}
catch (Exception e) {
log(ERRO, e.getMessage());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -