⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ajaxvncserver.java

📁 AjaxVNC 一个简单的远程控制服务器
💻 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 + -