- 浏览: 490921 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wang1352083:
正在搭建tomcat源码.一会儿参照楼主经验搭建spring源 ...
Eclipse中阅读开源项目代码 -
w123456789zzzz:
谢谢你,问题解决了,楼主万岁!!
eclipse中如何安装插件 -
xiaoLee:
...
软件性能测试论文草稿 -
铃儿响叮当:
...
使用firefox调试js -
gogopengyou:
很细心啊
eclipse中如何安装插件
[size=large] 背景:使用VNC客户端去连接DC上的VNC Server,采用的是代理的方式去访问。
基础研究: 使用Java实现代理服务器
参考资料:
http://www.ibm.com/developerworks/cn/java/l-javaproxy/index.html
http://ethen.iteye.com/blog/783338
参考代码:
————————————VNC代理实现版——————————————————
VNC协议分析参考资料:
http://blog.csdn.net/forever_feng/archive/2009/10/20/4703088.aspx
运行结果:
Accepted from:192.168.6.240:48887
PipeMessage: command=1
host=null
ips=[/192.168.6.240, /192.168.6.39, /192.168.6.240, /192.168.6.39, /192.168.6.245]
ipsSize=5
ports=[5909, 5908, 5909, 5908, 5901]
1 4 17 14 ffffffc0 ffffffa8 6 27 17 15 ffffffc0 ffffffa8 6 fffffff0 17 14 ffffffc0
ffffffa8 6 27 17 d ffffffc0 ffffffa8 6 fffffff5
Connected to /192.168.6.240:5909
Accepted from:192.168.6.240:48889
PipeMessage: command=1
host=null
ips=[/192.168.6.240, /192.168.6.39, /192.168.6.245]
ipsSize=3
ports=[5909, 5908, 5901]
1 2 17 14 ffffffc0 ffffffa8 6 27 17 d ffffffc0 ffffffa8 6 fffffff5
Connected to /192.168.6.240:5909
Accepted from:192.168.6.240:48893
PipeMessage: command=1
host=null
ips=[/192.168.6.245]
ipsSize=1
ports=[5901]
Connected to /192.168.6.245:5901
Connected to /192.168.6.245:5901
Aborting operation
Client to remote, stopped.
Aborting operation
Aborting operation
Client to remote, stopped.
Client to remote, stopped.
Remote to client, stopped
Remote to client, stopped
Remote to client, stopped
————————使用VISIO画出UML图解——————
基础研究: 使用Java实现代理服务器
参考资料:
http://www.ibm.com/developerworks/cn/java/l-javaproxy/index.html
http://ethen.iteye.com/blog/783338
参考代码:
package com.xxx.proxyserver; import java.io.*; import java.net.*; public class MyHttpProxy extends Thread { static public int CONNECT_RETRIES = 5; // 尝试与目标主机连接次数 static public int CONNECT_PAUSE = 5; // 每次建立连接的间隔时间 static public int TIMEOUT = 50; // 每次尝试连接的最大时间 static public int BUFSIZ = 1024; // 缓冲区最大字节数 static public boolean logging = false; // 是否记录日志 static public OutputStream log_S = null; // 日志输出流 static public OutputStream log_C = null; // 日志输出流 static public String LOGFILENAME_S = "log_S.txt"; static public String LOGFILENAME_C = "log_C.txt"; // 与客户端相连的Socket protected Socket csocket; public MyHttpProxy(Socket cs) { csocket = cs; start(); } public void writeLog(int c, boolean browser) throws IOException { if (browser) log_C.write((char) c); else log_S.write((char) c); } public void writeLog(byte[] bytes, int offset, int len, boolean browser) throws IOException { for (int i = 0; i < len; i++) writeLog((int) bytes[offset + i], browser); } public void run() { String buffer = ""; // 读取请求头 String URL = "http://www.baidu.com"; // 读取请求URL String host = ""; // 读取目标主机host int port = 80; // 默认端口80 Socket ssocket = null; // cis为客户端输入流,sis为目标主机输入流 InputStream cis = null, sis = null; // cos为客户端输出流,sos为目标主机输出流 OutputStream cos = null, sos = null; try { csocket.setSoTimeout(TIMEOUT); cis = csocket.getInputStream(); cos = csocket.getOutputStream(); while (true) { int c = cis.read(); if (c == -1) break; // -1为结尾标志 if (c == '\r' || c == '\n') break;// 读入第一行数据 buffer = buffer + (char) c; if (logging) writeLog(c, true); } // 抽取URL(<A href="http://www.baidu.com/">http://www.baidu.com/</A>) URL = getRequestURL(buffer); int n; // 抽取host n = URL.indexOf("//"); if (n != -1) host = URL.substring(n + 2); // www.baidu.com/ n = host.indexOf('/'); if (n != -1) host = host.substring(0, n);// www.baidu.com // 分析可能存在的端口号 n = host.indexOf(':'); if (n != -1) { port = Integer.parseInt(host.substring(n + 1)); host = host.substring(0, n); } int retry = CONNECT_RETRIES; while (retry-- != 0) { try { ssocket = new Socket(host, port); // 尝试建立与目标主机的连接 break; } catch (Exception e) { } // 等待 Thread.sleep(CONNECT_PAUSE); } if (ssocket != null) { ssocket.setSoTimeout(TIMEOUT); sis = ssocket.getInputStream(); sos = ssocket.getOutputStream(); sos.write(buffer.getBytes()); // 将请求头写入 pipe(cis, sis, sos, cos); // 建立通信管道 } } catch (Exception e) { e.printStackTrace(); } finally { try { csocket.close(); cis.close(); cos.close(); } catch (Exception e1) { System.out.println("\nClient Socket Closed Exception:"); e1.printStackTrace(); } try { ssocket.close(); sis.close(); sos.close(); } catch (Exception e2) { System.out.println("\nServer Socket Closed Exception:"); e2.printStackTrace(); } } } public String getRequestURL(String buffer) { String[] tokens = buffer.split(" "); String URL = ""; for (int index = 0; index < tokens.length; index++) { if (tokens[index].startsWith("http://")) { URL = tokens[index]; break; } } return URL; } /** *供客户端和目标服务器通过两个Socket通信 */ public void pipe(InputStream cis, InputStream sis, OutputStream sos, OutputStream cos) { try { int length; byte bytes[] = new byte[BUFSIZ]; while (true) { try { if ((length = cis.read(bytes)) > 0) { sos.write(bytes, 0, length); if (logging) writeLog(bytes, 0, length, true); } else if (length < 0) break; } catch (SocketTimeoutException e) { } catch (InterruptedIOException e) { System.out.println("\nRequest Exception:"); e.printStackTrace(); } try { if ((length = sis.read(bytes)) > 0) { cos.write(bytes, 0, length); if (logging) writeLog(bytes, 0, length, false); } else if (length < 0) break; } catch (SocketTimeoutException e) { } catch (InterruptedIOException e) { System.out.println("\nResponse Exception:"); e.printStackTrace(); } } } catch (Exception e0) { System.out.println("Pipe异常: " + e0); } } public static void startProxy(int port, Class clobj) { try { ServerSocket ssock = new ServerSocket(port); while (true) { Class[] sarg = new Class[1]; Object[] arg = new Object[1]; sarg[0] = Socket.class; try { java.lang.reflect.Constructor cons = clobj .getDeclaredConstructor(sarg); arg[0] = ssock.accept(); cons.newInstance(arg); // 创建HttpProxy或其派生类的实例 } catch (Exception e) { Socket esock = (Socket) arg[0]; try { esock.close(); } catch (Exception ec) { } } } } catch (IOException e) { System.out.println("\nStartProxy Exception:"); e.printStackTrace(); } } // 测试用的简单main方法 static public void main(String args[]) throws FileNotFoundException { System.out.println("在端口808启动代理服务器\n"); OutputStream file_S = new FileOutputStream(new File(LOGFILENAME_S)); OutputStream file_C = new FileOutputStream(new File(LOGFILENAME_C)); MyHttpProxy.log_S = file_S; MyHttpProxy.log_C = file_C; MyHttpProxy.logging = true; MyHttpProxy.startProxy(808, MyHttpProxy.class); } }
————————————VNC代理实现版——————————————————
VNC协议分析参考资料:
http://blog.csdn.net/forever_feng/archive/2009/10/20/4703088.aspx
public Map<String, PipeInfo> getPipeInfos(String datacenterId) { Map<String, PipeInfo> result = new HashMap<String, PipeInfo>(); PipeInfo consolePipeInfo = getConsolePipeInfo(); PipeInfo datacenterPipeInfo = getDatacenterPipeInfo(datacenterId); result.put(PipeInfo.CONSOLE_PIPE_INFO_KEY, consolePipeInfo); result.put(PipeInfo.DATACENTER_PIPE_INFO_KEY, datacenterPipeInfo); return result; } private PipeInfo getConsolePipeInfo() { PipeInfo pipeInfo = new PipeInfo(); pipeInfo.setPipeIp(SystemConfigUtil.getCloudOuterIp()); pipeInfo.setPipePort(pipeService.getPort()); return pipeInfo; } public class PipeInfo implements Serializable { private static final long serialVersionUID = 1L; public static String CONSOLE_PIPE_INFO_KEY = "CONSOLE_PIPE_INFO_KEY"; public static String DATACENTER_PIPE_INFO_KEY = "DATACENTER_PIPE_INFO_KEY"; private String pipeIp; private int pipePort; public String getPipeIp() { return pipeIp; } public void setPipeIp(String pipeIp) { this.pipeIp = pipeIp; } public int getPipePort() { return pipePort; } public void setPipePort(int pipePort) { this.pipePort = pipePort; } public class PipeService implements InitializingBean, DisposableBean, Runnable{ private int port; public PipeService(){ } public int getPort() { return port; } public void setPort(int port) { this.port = port; } private PipeServer server; @Override public void afterPropertiesSet() throws Exception { new Thread(this).start(); } @Override public void destroy() throws Exception { if(server != null) { server.stop(); } } @Override public void run() { try { server = new PipeServer(); InetAddress localAddress = InetAddress.getByName("0.0.0.0"); server.start(port, 5, localAddress); } catch (UnknownHostException e) { e.printStackTrace(); } } public class PipeServer implements Runnable { static final int START_MODE = 0; static final int ACCEPT_MODE = 1; static final int PIPE_MODE = 2; static final int ABORT_MODE = 3; static final int BUF_SIZE = 8192; Socket sock = null, remote_sock = null; ServerSocket ss = null; InputStream in, remote_in; OutputStream out, remote_out; PipeMessage msg; int mode; Thread pipe_thread1, pipe_thread2; long lastReadTime; static int iddleTimeout = 180000; // 3 minutes static PrintStream log = System.out; PipeServer() { } public PipeServer(Socket s) { this.sock = s; mode = START_MODE; } public void start(int port, int backlog, InetAddress localIP) { try { ss = new ServerSocket(port, backlog, localIP); log("Starting Pipe Server on:" + ss.getInetAddress().getHostAddress() + ":" + ss.getLocalPort()); while (true) { Socket s = ss.accept(); log("Accepted from:" + s.getInetAddress().getHostName() + ":" + s.getPort()); PipeServer ps = new PipeServer(s); (new Thread(ps)).start(); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { } } static final void log(String s) { if (log != null) { log.println(s); log.flush(); } } public static void setLog(OutputStream out) { if (out == null) { log = System.out; } else { log = new PrintStream(out, true); } } @Override public void run() { switch (mode) { case START_MODE: try { startSession(); } catch (IOException ioe) { // handleException(ioe); ioe.printStackTrace(); } finally { abort(); log("Client to remote, stopped."); } break; case PIPE_MODE: try { pipe(remote_in, out); } catch (IOException ioe) { } finally { abort(); log("Remote to client, stopped"); } break; case ABORT_MODE: break; default: log("Unexpected MODE " + mode); } } private void pipe(InputStream in, OutputStream out) throws IOException { lastReadTime = System.currentTimeMillis(); byte[] buf = new byte[BUF_SIZE]; int len = 0; while (len >= 0) { try { if (len != 0) { out.write(buf, 0, len); out.flush(); } len = in.read(buf); lastReadTime = System.currentTimeMillis(); } catch (InterruptedIOException iioe) { if (iddleTimeout == 0) break;// Other thread interrupted us. long timeSinceRead = System.currentTimeMillis() - lastReadTime; if (timeSinceRead >= iddleTimeout - 1000) // -1s for adjustment. break; len = 0; } } } private synchronized void abort() { if (mode == ABORT_MODE) return; mode = ABORT_MODE; try { log("Aborting operation"); if (pipe_thread1 != null) { pipe_thread1.interrupt(); } if (pipe_thread2 != null) { pipe_thread2.interrupt(); } if (sock.isBound() && !sock.isClosed()) { sock.close(); } if (remote_sock.isBound() && !remote_sock.isClosed()) { remote_sock.close(); } // if (ss != null) { // ss.close(); // } } catch (IOException ioe) { } } private void startSession() throws IOException { sock.setSoTimeout(iddleTimeout); in = sock.getInputStream(); out = sock.getOutputStream(); msg = readMsg(in); handleRequest(msg); } private PipeMessage readMsg(InputStream in) throws IOException { PipeMessage msg; msg = new PipeMessage(in); return msg; } private void handleRequest(PipeMessage msg) throws IOException { log(msg.toString()); switch (msg.command) { case PipeMessage.PIPE_CMD_CONNECT: onConnect(msg); break; default: throw new PipeException(PipeMessage.PIPE_CMD_NOT_SUPPORTED, "Pipe command does not support"); } } private void onConnect(PipeMessage msg) throws IOException { Socket s = null; try { if (msg.ipsSize == 1) { s = new Socket(msg.ips[0], msg.ports[0]); } else { PipeMessage pm = new PipeMessage(PipeMessage.PIPE_CMD_CONNECT, msg.ips, msg.ports, 1); s = new Socket(msg.ips[0], msg.ports[0]); pm.write(s.getOutputStream()); } log("Connected to " + s.getInetAddress() + ":" + s.getPort()); } catch (Exception sE) { log("Failed connecting to remote socket. Exception: " + sE.getLocalizedMessage()); } if (s != null) { startPipe(s); } else { throw (new RuntimeException("onConnect() Failed to create Socket()")); } return; } private void startPipe(Socket s) { mode = PIPE_MODE; remote_sock = s; try { remote_in = s.getInputStream(); remote_out = s.getOutputStream(); pipe_thread1 = Thread.currentThread(); pipe_thread2 = new Thread(this); pipe_thread2.start(); pipe(in, remote_out); } catch (IOException ioe) { ioe.printStackTrace(); } } static public void main(String[] args) throws UnknownHostException { int port = 5900; if (args.length > 0) { port = Integer.parseInt(args[0]); } PipeServer server = new PipeServer(); server.start(port, 5, InetAddress.getByName("0.0.0.0")); } public void stop() { try { if (ss.isBound() && !ss.isClosed()) { ss.close(); } } catch (IOException e) { log("failed to close server socket. " + e.getMessage()); } } public class PipeMessage { public int command; public String host = null; public InetAddress[] ips = null; public int[] ports = null; public int ipsSize = 0; private byte[] msgBytes; private int msgLength; static final int PIPE_CMD_CONNECT = 0x1; static final int PIPE_CMD_NOT_SUPPORTED = 1; // request message PipeMessage(int command, InetAddress[] ips, int[] ports) { this.command = command; this.ips = ips; this.ports = ports; msgLength = ips.length * 6 + 2; msgBytes = new byte[msgLength]; msgBytes[0] = (byte) command; msgBytes[1] = (byte) (ips.length); int msgP = 2; for (int i = 0; i < ips.length; i++) { byte[] addr; msgBytes[msgP] = (byte) (ports[i] >> 8); msgBytes[msgP + 1] = (byte) (ports[i]); msgP += 2; addr = ips[i].getAddress(); System.arraycopy(addr, 0, msgBytes, msgP, 4); msgP += 4; } } PipeMessage(int command, InetAddress[] ips, int[] ports,int offset) { this.command = command; this.ips = ips; this.ports = ports; msgLength = (ips.length-offset) * 6 + 2; msgBytes = new byte[msgLength]; msgBytes[0] = (byte) command; msgBytes[1] = (byte) (ips.length-offset); int msgP = 2; for (int i = offset; i < ips.length; i++) { byte[] addr; msgBytes[msgP] = (byte) (ports[i] >> 8); msgBytes[msgP + 1] = (byte) (ports[i]); msgP += 2; addr = ips[i].getAddress(); System.arraycopy(addr, 0, msgBytes, msgP, 4); msgP += 4; } } // response message PipeMessage(int command, int status) { this.command = command; msgLength = 3; msgBytes = new byte[msgLength]; msgBytes[0] = (byte) command; msgBytes[1] = (byte) status; msgBytes[msgBytes.length - 1] = 0; } PipeMessage() { } public PipeMessage(InputStream in) throws IOException { msgBytes = null; read(in); } public void read(InputStream in) throws IOException { DataInputStream d_in = new DataInputStream(in); command = d_in.readUnsignedByte(); switch (command) { case PipeMessage.PIPE_CMD_CONNECT: ipsSize = d_in.readUnsignedByte(); ips = new InetAddress[ipsSize]; ports = new int[ipsSize]; for (int i = 0; i < ipsSize; i++) { ports[i] = d_in.readUnsignedShort(); byte[] addr = new byte[4]; d_in.readFully(addr); ips[i] = bytes2IP(addr); } break; default: throw new PipeException(PipeMessage.PIPE_CMD_NOT_SUPPORTED, "Pipe command does not support at reading"); } } public void write(OutputStream out) throws IOException { if (msgBytes == null) { PipeMessage msg = new PipeMessage(command, ips, ports); msgBytes = msg.msgBytes; msgLength = msg.msgLength; } out.write(msgBytes); for (int i=0;i<msgLength;i++) System.err.print(Integer.toHexString(msgBytes[i])+" "); System.err.println(); } public int getCommand() { return command; } public void setCommand(int command) { this.command = command; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public InetAddress[] getIps() { return ips; } public void setIps(InetAddress[] ips) { this.ips = ips; } public int getIpsSize() { return ipsSize; } public void setIpsSize(int ipsSize) { this.ipsSize = ipsSize; } static InetAddress bytes2IP(byte[] addr) { String s = bytes2IPV4(addr, 0); try { return InetAddress.getByName(s); } catch (UnknownHostException uh_ex) { return null; } } static final String bytes2IPV4(byte[] addr, int offset) { String hostName = "" + (addr[offset] & 0xFF); for (int i = offset + 1; i < offset + 4; ++i) hostName += "." + (addr[i] & 0xFF); return hostName; } @Override public String toString() { return "PipeMessage: command=" + command + "\n host=" + host + "\n ips=" + Arrays.toString(ips) + "\n ipsSize=" + ipsSize + "\n ports=" + Arrays.toString(ports) + "\n";}
运行结果:
Accepted from:192.168.6.240:48887
PipeMessage: command=1
host=null
ips=[/192.168.6.240, /192.168.6.39, /192.168.6.240, /192.168.6.39, /192.168.6.245]
ipsSize=5
ports=[5909, 5908, 5909, 5908, 5901]
1 4 17 14 ffffffc0 ffffffa8 6 27 17 15 ffffffc0 ffffffa8 6 fffffff0 17 14 ffffffc0
ffffffa8 6 27 17 d ffffffc0 ffffffa8 6 fffffff5
Connected to /192.168.6.240:5909
Accepted from:192.168.6.240:48889
PipeMessage: command=1
host=null
ips=[/192.168.6.240, /192.168.6.39, /192.168.6.245]
ipsSize=3
ports=[5909, 5908, 5901]
1 2 17 14 ffffffc0 ffffffa8 6 27 17 d ffffffc0 ffffffa8 6 fffffff5
Connected to /192.168.6.240:5909
Accepted from:192.168.6.240:48893
PipeMessage: command=1
host=null
ips=[/192.168.6.245]
ipsSize=1
ports=[5901]
Connected to /192.168.6.245:5901
Connected to /192.168.6.245:5901
Aborting operation
Client to remote, stopped.
Aborting operation
Aborting operation
Client to remote, stopped.
Client to remote, stopped.
Remote to client, stopped
Remote to client, stopped
Remote to client, stopped
————————使用VISIO画出UML图解——————
- 基于Java多线程的HTTP代理服务器的研究与实现.rar (97 KB)
- 下载次数: 16
- VNC.rar (2.9 MB)
- 下载次数: 35
发表评论
-
性能问题
2013-09-04 20:13 0<SERVICE CLASS=" ... -
ant中使用svn检出代码
2011-05-14 21:33 2918[size=large][size=large][size=l ... -
Ant与批处理(win环境)学习3
2011-04-10 23:48 1173此篇主要讲实践,大多数情况下是直接贴的代码了 ... -
1号~15号工作日志
2011-01-16 22:23 8471、 Flex的includeInLayout属 ... -
JAVA异常处理
2011-01-11 22:51 657在je上看到一篇有关异常处理的文章,觉得还不错... . ... -
Java配置项
2011-01-11 20:44 844背景:项目中有许多可选参数,这时如果采取硬编码的方式将非 ... -
offLineMap2工作日记之getBoolean
2011-01-06 23:25 7561、如字段不是get**开头的boolean 如: boole ... -
开发常用小工具集
2011-01-06 22:26 1969毕业也有半年了,我有幸能加入一家知名IT公司并从事时下最 ... -
Eclipse中阅读开源项目代码
2010-12-25 22:57 2671[size=large] 背景:由于最近较为系统地学习了 ... -
Eclipse调试深入
2010-12-25 18:59 1274背景:我个人的调 ... -
Java打包总结
2010-12-19 22:35 1366背景:最近下载了一 ... -
Ant与批处理(win环境)学习笔记(2)
2010-12-19 22:01 1173在《Ant与批处理(win环境)学习笔记》中学习了Ant的一些 ... -
Ant与批处理(win环境)学习笔记
2010-12-19 10:27 1407背景:最近个人附 ... -
JDK工具学习
2010-12-18 22:14 997[size=large] 起因:在 ... -
Eclipse插件安装总结
2010-12-18 12:29 1162大学时一直使用的 ... -
使用Ant和Maven构建时出现OOM异常
2010-12-14 23:14 1725今日更新测试环境时报OOM错误(工程中使用了Ant和Ma ... -
JAVA技术见识集
2010-12-12 09:34 830[size=large] 将网上看到的一些适用于指定场景的 ... -
Eclipse异常集
2010-12-08 19:52 22381、 Eclipse异常说An internal Error ... -
将批处理文件注册成服务
2010-11-15 19:49 3498前两天完成了将java程序注册成win服务,如今本人有一 ... -
将java程序做成windows系统服务
2010-11-11 19:42 2269近日一直在忙于Rhel( ...
相关推荐
rust-vnc, VNC协议客户端状态机客户端和代理的实现 rustVNC 是实现VNC协议和客户... 也有两个使用它的板条箱:一个基于SDL2的全功能VNC客户端, VNC客户机一个缓冲VNC代理,VNC代理 。VNC客户机在 QEMU ( 和 Xen HVM )
仅限于测试之用,不能用于商业用途。 只有在安装SERVER 端面时才需要序列号。 VNC代表虚拟网络计算。这个软件的开发是一个远程控制软件,该软件允许你查看和使用查看器应用程序的计算机与另一的交互。两台计算机...
适用于企业内部IT运维人员远程控制,及家庭网络使用
Go的VNC代理库 go-vnc-proxy是Go的VNC代理库 支持多个NOVNC WebSocket客户端连接 支持成为“ websockify”代理(适用于像NoVnc这样的Web客户端) 支持X509None(vencrypt) 经过严格编码测试,具有: NoVnc(网络...
前面说了 noVNC 采用 WebSockets 实现,但是目前大多数 VNC 服务器都不支持 WebSockets,所以 noVNC 是不能直接连接 VNC 服务器的,怎么办呢?需要一个代理来做 WebSockets 和 TCP sockets 之间的转换,理解这一点...
缓冲的VNC代理vnc-proxy 。 VNC客户端具有特殊的技巧,可以解决QEMU(和Xen HVM)中使用的VNC服务器中的错误。 如何? 完全是错误的。 最终解决了。 我遇到了一个非常奇怪的故障,其中连接了VNC控制台的Xen domU...
Guacamole 是一个基于 HTML 5 和 JavaScript 的 VNC 查看器,服务端基于 Java 的 VNC-to-XML 代理开发。要求浏览器支持 HTML 5。 Guacamole 是无客户端的远程桌面网关,Guacamole 支持标准协议,比如 VNC 和 RDP。 ...
Invoke-Vnc-Powershell VNC注入器Invoke-Vnc在内存中执行VNC代理并启动反向连接,或绑定到指定端口。 支持密码验证。 使用示例本地调用:Invoke-Vnc-Powershell VNC注入器Invoke-Vnc在内存中执行VNC代理并启动反向...
vncviewer代理监控后台整机服务器
VNC Reflector是专用的VNC服务器,它充当位于实际VNC服务器(主机)和多个VNC客户端之间的代理。 它旨在与大量客户有效地合作。
Invoke-Vnc:一个powershell VNC注入器。在内存中执行VNC代理并启动反向连接,或绑定到指定的端口。 支持密码验证。
由两个代理组成的软件系统,这些代理捕获TCP流量上的VNC并将其转换为RTP上的VNC,以便向VNC提供流功能。
docker-idrac6:iDRAC 6 Web界面和VNC代理
伦库 1.简介 工作正在进行中。...2.1 Jupyter服务器代理-novnc + websockify-x11vnc-xvbf 好处 就是行得通 Xvbf建立在本机OS发行商的X.org/X11实现上,以实现更好的兼容性 缺点 xvbuf上方x11vnc的开销(在
1 、首先,先简单介绍一下概念。...noVNC 采用 WebSockets 实现,但是当前大多 VNC 服务器不支持 WebSocket,所以 noVNC 不能直连 VNC 服务器,而是需要开启一个代理来做 WebSockets 和 TCP sockets 之间的转换。
协议支持vnc,rdp,ssh。 支持内外穿透、四层协议代理。 配合使用即使被控PC没有公网也能进行远程控制,随时随地进行远程控制,还可支持代理局域网端口。 支持个人、企业、权限控制。 部署如有问题请加群讨论 系统...
反向代理 基于主机名的路由 基于URL路径的路由 外壳访问 增加共享内存大小 声音支持 通过环境变量设置Chromium首选项 故障排除崩溃 支持或联系 快速开始 注意:本快速入门中提供的Docker命令是作为示例提供的,应...
openkbs / rest-dev-vnc-docker 通过将实际的工作示例显示为演示,模板和实际配置的一部分,您可以轻松调整或修改以成为自己的示例。 Nginx配置文件夹 您所需要做的就是提供./etc/nginx配置文件夹并启动此Docker...
可定制的蜜罐,用于监视网络流量,漫游器活动和用户名\密码凭证(DNS,HTTP代理,HTTP,HTTPS,SSH,POP3,IMAP,STMP,RDP,VNC,SMB,SOCKS5,Redis,TELNET和Postgres和MySQL) Grafana界面 NMAP扫描 凭证监控 ...