- 浏览: 508495 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
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 2955[size=large][size=large][size=l ... -
Ant与批处理(win环境)学习3
2011-04-10 23:48 1210此篇主要讲实践,大多数情况下是直接贴的代码了 ... -
1号~15号工作日志
2011-01-16 22:23 8841、 Flex的includeInLayout属 ... -
JAVA异常处理
2011-01-11 22:51 694在je上看到一篇有关异常处理的文章,觉得还不错... . ... -
Java配置项
2011-01-11 20:44 900背景:项目中有许多可选参数,这时如果采取硬编码的方式将非 ... -
offLineMap2工作日记之getBoolean
2011-01-06 23:25 7901、如字段不是get**开头的boolean 如: boole ... -
开发常用小工具集
2011-01-06 22:26 2013毕业也有半年了,我有幸能加入一家知名IT公司并从事时下最 ... -
Eclipse中阅读开源项目代码
2010-12-25 22:57 2713[size=large] 背景:由于最近较为系统地学习了 ... -
Eclipse调试深入
2010-12-25 18:59 1316背景:我个人的调 ... -
Java打包总结
2010-12-19 22:35 1406背景:最近下载了一 ... -
Ant与批处理(win环境)学习笔记(2)
2010-12-19 22:01 1224在《Ant与批处理(win环境)学习笔记》中学习了Ant的一些 ... -
Ant与批处理(win环境)学习笔记
2010-12-19 10:27 1442背景:最近个人附 ... -
JDK工具学习
2010-12-18 22:14 1025[size=large] 起因:在 ... -
Eclipse插件安装总结
2010-12-18 12:29 1202大学时一直使用的 ... -
使用Ant和Maven构建时出现OOM异常
2010-12-14 23:14 1755今日更新测试环境时报OOM错误(工程中使用了Ant和Ma ... -
JAVA技术见识集
2010-12-12 09:34 869[size=large] 将网上看到的一些适用于指定场景的 ... -
Eclipse异常集
2010-12-08 19:52 22861、 Eclipse异常说An internal Error ... -
将批处理文件注册成服务
2010-11-15 19:49 3532前两天完成了将java程序注册成win服务,如今本人有一 ... -
将java程序做成windows系统服务
2010-11-11 19:42 2303近日一直在忙于Rhel( ...
相关推荐
rust-vnc, VNC协议客户端状态机客户端和代理的实现 rustVNC 是实现VNC协议和客户... 也有两个使用它的板条箱:一个基于SDL2的全功能VNC客户端, VNC客户机一个缓冲VNC代理,VNC代理 。VNC客户机在 QEMU ( 和 Xen HVM )
仅限于测试之用,不能用于商业用途。 只有在安装SERVER 端面时才需要序列号。 VNC代表虚拟网络计算。这个软件的开发是一个远程控制软件,该软件允许你查看和使用查看器应用程序的计算机与另一的交互。两台计算机...
也可以通过VNC服务器的代理或反射服务,如NoVNC,它提供了基于Web的VNC客户端,无需安装额外软件。 6. **源码与工具**:VNC的开源特性使得开发者可以深入理解其工作原理,并根据需要进行定制和扩展。例如,有的...
2. **连接设置**:VNC支持多种连接模式,包括直接连接、通过代理服务器或者使用安全套接字层(SSL)或互联网协议安全(IPSec)加密的连接。 3. **分辨率调整**:VNC客户端允许用户自定义远程桌面的显示分辨率,以适应...
VNC(Virtual Network Computing)是一种远程桌面协议,它允许用户通过网络访问并控制另一台计算机的图形界面。在Linux系统中,尤其是Red Hat Enterprise Linux(Redhat)这样的发行版,VNC是进行远程管理的强大工具...
Go的VNC代理库 go-vnc-proxy是Go的VNC代理库 支持多个NOVNC WebSocket客户端连接 支持成为“ websockify”代理(适用于像NoVnc这样的Web客户端) 支持X509None(vencrypt) 经过严格编码测试,具有: NoVnc(网络...
3. **通信**:客户端和服务器之间的通信可以是TCP/IP或者通过HTTP代理,确保在各种网络环境下都能正常工作。 **VNCViewer的使用步骤:** 1. **安装VNC服务器**:在远程计算机上安装VNC服务器软件,如 TightVNC 或 ...
- **使用代理连接**:如果Linux服务器位于内网,可以通过设置代理服务器进行连接。 - **自定义快捷键**:可以为常见的操作设置快捷键,提高工作效率。 6. **注意事项** - **安全风险**:尽管RealVNC支持加密,但...
VNC(Virtual Network Computing)是一种基于RFB协议的远程桌面技术,它允许用户通过网络连接到另一台计算机的图形界面,实现远程控制和共享。在本主题中,我们主要关注的是VNC的源码学习,特别是针对"TightVNC"这个...
前面说了 noVNC 采用 WebSockets 实现,但是目前大多数 VNC 服务器都不支持 WebSockets,所以 noVNC 是不能直接连接 VNC 服务器的,怎么办呢?需要一个代理来做 WebSockets 和 TCP sockets 之间的转换,理解这一点...
Go-VNC-Proxy-Main是一个用Go语言编写的VNC代理服务程序,它允许用户通过一个中间代理来控制远程VNC服务器。源码分析和实践对于理解其工作原理以及如何在实际项目中应用具有重要的价值。本文将深入探讨该项目的核心...
缓冲的VNC代理vnc-proxy 。 VNC客户端具有特殊的技巧,可以解决QEMU(和Xen HVM)中使用的VNC服务器中的错误。 如何? 完全是错误的。 最终解决了。 我遇到了一个非常奇怪的故障,其中连接了VNC控制台的Xen domU...
在`Invoke-Vnc`中,VNC代理可以在两种模式下运行: 1. 反向连接模式:VNC服务器会主动连接到攻击者的IP地址和指定端口,这需要攻击者具有对外部网络的访问权限。 2. 绑定模式:VNC服务器将绑定到目标系统上的特定...
vnc-ssh 通过SSH端口转发从远程安全地连接到VNC(向localhost打开)安装在主机中,使用-localhost选项打开VNC服务器。 vncserver -localhost -geometry {vnc screen resolution} :{display number} 将您的客户端ssh...
Guacamole 是一个基于 HTML 5 和 JavaScript 的 VNC 查看器,服务端基于 Java 的 VNC-to-XML 代理开发。要求浏览器支持 HTML 5。 Guacamole 是无客户端的远程桌面网关,Guacamole 支持标准协议,比如 VNC 和 RDP。 ...
在安全性方面,虽然VNC提供了便捷的远程访问,但其默认传输是不加密的,因此建议在生产环境中使用SSH隧道或者HTTPS代理来增强安全性。此外,定期更改VNC密码也是必要的安全实践。 在“vnc-server-install-112210”...
Invoke-Vnc-Powershell VNC注入器Invoke-Vnc在内存中执行VNC代理并启动反向连接,或绑定到指定端口。 支持密码验证。 使用示例本地调用:Invoke-Vnc-Powershell VNC注入器Invoke-Vnc在内存中执行VNC代理并启动反向...
ssh 基于web的远程控制。协议支持vnc,rdp,ssh支持内外穿透、四层协议代理.zip