Java局域网远程控制

标签: java 局域网 远程控制 | 发表时间:2013-08-02 12:34 | 作者:
出处:http://www.iteye.com
package org.fw.qq.plugins.remoteassistance;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ControlCarrier implements Serializable {

	private String type;
	private int mouseX = -1;
	private int mouseY = -1;
	private int wheelAmt = -1;
	private int mousePressBtn = -1;
	private int mouseReleaseBtn = -1;
	private List<Integer> keyPressCode = new ArrayList<Integer>();
	private List<Integer> keyReleaseCode = new ArrayList<Integer>();
	private byte[] desktopImg = null;

	public byte[] getDesktopImg() {
		return desktopImg;
	}
	public void setDesktopImg(byte[] desktopImg) {
		this.desktopImg = desktopImg;
	}
	public int getMousePressBtn() {
		return mousePressBtn;
	}
	public void setMousePressBtn(int mousePressBtn) {
		this.mousePressBtn = mousePressBtn;
	}
	public int getMouseReleaseBtn() {
		return mouseReleaseBtn;
	}
	public void setMouseReleaseBtn(int mouseReleaseBtn) {
		this.mouseReleaseBtn = mouseReleaseBtn;
	}
	public int getMouseX() {
		return mouseX;
	}
	public void setMouseX(int mouseX) {
		this.mouseX = mouseX;
	}
	public int getMouseY() {
		return mouseY;
	}
	public void setMouseY(int mouseY) {
		this.mouseY = mouseY;
	}
	public int getWheelAmt() {
		return wheelAmt;
	}
	public void setWheelAmt(int wheelAmt) {
		this.wheelAmt = wheelAmt;
	}

	/**
	 * 
	 */
	private static final long serialVersionUID = -3074156105274743383L;

	public List<Integer> getKeyPressCode() {
		return keyPressCode;
	}
	public void setKeyPressCode(List<Integer> keyPressCode) {
		this.keyPressCode = keyPressCode;
	}
	public List<Integer> getKeyReleaseCode() {
		return keyReleaseCode;
	}
	public void setKeyReleaseCode(List<Integer> keyReleaseCode) {
		this.keyReleaseCode = keyReleaseCode;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		PropertyDescriptor[] pd = null;
		try {
			pd = Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors();
			for (PropertyDescriptor propertyDescriptor : pd) {
				Method method = propertyDescriptor.getReadMethod();
				builder.append("\n ");
				builder.append(propertyDescriptor.getName());
				builder.append(" : ");
				builder.append(method.invoke(this));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return builder.toString();
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
}

 

package org.fw.qq.plugins.remoteassistance;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Client extends JPanel implements MouseListener, MouseMotionListener, MouseWheelListener, KeyListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = -806686211556049511L;
	private String controlIp;
	private int controlPort;
	private BufferedImage controlDesktop;

	public Client(String controlIp, int controlPort) {
		this.controlIp = controlIp;
		this.controlPort = controlPort;

		setFocusable(true);
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		this.addMouseWheelListener(this);
		this.addKeyListener(this);

	}

	public void start() {
		ControlCarrier command = new ControlCarrier();
		sendControlCommand(command);
	}

	public void paintComponent(Graphics g) {
		if (controlDesktop != null) {
			g.drawImage(controlDesktop, 0, 0, this);
		}
	}

	private void sendControlCommand(ControlCarrier command) {
		ObjectOutputStream objectOut = null;
		ObjectInputStream objectInput = null;
		try {
			Socket commandSocket = new Socket(InetAddress.getByName(controlIp), controlPort);
			objectOut = new ObjectOutputStream(new BufferedOutputStream(commandSocket.getOutputStream()));
			objectOut.writeObject(command);
			objectOut.flush();

			objectInput = new ObjectInputStream(new BufferedInputStream(commandSocket.getInputStream()));
			ControlCarrier desktopState = (ControlCarrier) objectInput.readObject();
			displayDesktopState(desktopState);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (objectOut != null) {
				try {
					objectOut.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (objectInput != null) {
				try {
					objectInput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void displayDesktopState(ControlCarrier desktopState) {
		ByteArrayInputStream bin = new ByteArrayInputStream(desktopState.getDesktopImg());
		try {
			controlDesktop = ImageIO.read(bin);
		} catch (IOException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "被控制端已断开连接,或网络异常!");
		}
		repaint();
	}

	public void mouseClicked(MouseEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mouseClicked");
		if (e.getClickCount() == 1) {
			if (e.getButton() == MouseEvent.BUTTON1) {
				command.setMousePressBtn(InputEvent.BUTTON1_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON1_MASK);
			} else if (e.getButton() == MouseEvent.BUTTON2) {
				command.setMousePressBtn(InputEvent.BUTTON2_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON2_MASK);
			} else if (e.getButton() == MouseEvent.BUTTON3) {
				command.setMousePressBtn(InputEvent.BUTTON3_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON3_MASK);
			}
		} else if (e.getClickCount() == 2) {
			if (e.getButton() == MouseEvent.BUTTON1) {
				command.setMousePressBtn(InputEvent.BUTTON1_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON1_MASK);
				command.setMousePressBtn(InputEvent.BUTTON1_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON1_MASK);
			} else if (e.getButton() == MouseEvent.BUTTON2) {
				command.setMousePressBtn(InputEvent.BUTTON2_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON2_MASK);
				command.setMousePressBtn(InputEvent.BUTTON2_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON2_MASK);
			} else if (e.getButton() == MouseEvent.BUTTON3) {
				command.setMousePressBtn(InputEvent.BUTTON3_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON3_MASK);
				command.setMousePressBtn(InputEvent.BUTTON3_MASK);
				command.setMouseReleaseBtn(InputEvent.BUTTON3_MASK);
			}
		}
		sendControlCommand(command);
	}

	public void mouseEntered(MouseEvent e) {

	}

	public void mouseExited(MouseEvent e) {

	}

	public void mousePressed(MouseEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mousePressed");
		if (e.getButton() == MouseEvent.BUTTON1) {
			command.setMousePressBtn(InputEvent.BUTTON1_MASK);
		} else if (e.getButton() == MouseEvent.BUTTON2) {
			command.setMousePressBtn(InputEvent.BUTTON2_MASK);
		} else if (e.getButton() == MouseEvent.BUTTON3) {
			command.setMousePressBtn(InputEvent.BUTTON3_MASK);
		}
		sendControlCommand(command);
	}

	public void mouseReleased(MouseEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mouseReleased");
		if (e.getButton() == MouseEvent.BUTTON1) {
			command.setMouseReleaseBtn(InputEvent.BUTTON1_MASK);
		} else if (e.getButton() == MouseEvent.BUTTON2) {
			command.setMouseReleaseBtn(InputEvent.BUTTON2_MASK);
		} else if (e.getButton() == MouseEvent.BUTTON3) {
			command.setMouseReleaseBtn(InputEvent.BUTTON3_MASK);
		}
		sendControlCommand(command);
	}

	public void mouseDragged(MouseEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mouseDragged");
		command.setMousePressBtn(e.getButton());
		command.setMouseX(e.getX());
		command.setMouseY(e.getY());
		sendControlCommand(command);
	}

	public void mouseMoved(MouseEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mouseMoved");
		command.setMouseX(e.getX());
		command.setMouseY(e.getY());
		sendControlCommand(command);
	}

	public void mouseWheelMoved(MouseWheelEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("mouseWheelMoved");
		command.setWheelAmt(e.getWheelRotation());
		sendControlCommand(command);
	}

	public void keyPressed(KeyEvent e) {

		ControlCarrier command = new ControlCarrier();
		command.setType("keyPressed");
		List<Integer> keyPress = new ArrayList<Integer>();
		if (e.isControlDown()) {
			keyPress.add(KeyEvent.VK_CONTROL);
		}
		if (e.isAltDown()) {
			keyPress.add(KeyEvent.VK_ALT);
		}
		if (e.isShiftDown()) {
			keyPress.add(KeyEvent.VK_SHIFT);
		}
		keyPress.add(e.getKeyCode());
		command.setKeyPressCode(keyPress);
		sendControlCommand(command);
	}

	public void keyReleased(KeyEvent e) {
		ControlCarrier command = new ControlCarrier();
		command.setType("keyReleased");
		List<Integer> keyRelease = new ArrayList<Integer>();
		keyRelease.add(e.getKeyCode());
		command.setKeyReleaseCode(keyRelease);
		sendControlCommand(command);
	}

	public void keyTyped(KeyEvent e) {

	}

	public Dimension getPreferredSize() {
		return new Dimension(getWidth(), getHeight());
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("远程控制");
		String ip = JOptionPane.showInputDialog("请输入远程连接IP");
		if ("null".equals(ip)) {
			System.exit(0);
		}
		while (ip.isEmpty()) {
			ip = JOptionPane.showInputDialog("请输入远程连接IP");
		}
		while (!StringUtil.isValidIP(ip)) {
			ip = JOptionPane.showInputDialog("请输入合法IP");
		}

		String port = JOptionPane.showInputDialog("输入远程连接端口");
		if ("null".equals(port)) {
			System.exit(0);
		}
		while (port.isEmpty()) {
			port = JOptionPane.showInputDialog("请输入远程连接端口");
		}
		while (!StringUtil.isValidPort(port)) {
			port = JOptionPane.showInputDialog("请输入合法端口");
		}
		JOptionPane.showMessageDialog(null, "开始远程连接!");

		Client client = new Client(ip, Integer.parseInt(port));
		JScrollPane jsp = new JScrollPane(client, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		frame.add(jsp);
		frame.setDefaultCloseOperation(3);
		frame.setSize(800, 600);
		frame.setVisible(true);
	}

}

 

package org.fw.qq.plugins.remoteassistance;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Server extends JPanel implements Runnable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -927388268343256207L;
	private ServerSocket server;
	private Thread thread;
	private Robot controlMouseRobot;
	private JButton releaseConnect;
	private JLabel label;

	public Server(String ip, int port) throws IOException, AWTException {
		server = new ServerSocket(port, 1, InetAddress.getByName(ip));
		thread = new Thread(this);
		controlMouseRobot = new Robot();

		label = new JLabel("监听" + ip + ":" + port);
		
		releaseConnect = new JButton("断开连接");
		this.add(releaseConnect);
		releaseConnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop();
			}
		});
		this.add(label);
		this.add(releaseConnect);
	}

	public void start() {
		thread.start();
	}

	@SuppressWarnings("deprecation")
	public void stop() {
		label.setText("已断开连接");
		thread.stop();
		try {
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void run() {

		while (true) {
			ObjectInputStream request = null;
			ObjectOutputStream response = null;
			try {
				Socket client = server.accept();
				label.setText("被控制中");
				request = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
				ControlCarrier carrier = (ControlCarrier) request.readObject();

				System.out.println("收到命令:" + carrier);

				if (carrier.getMouseX() != -1 && carrier.getMouseY() != -1) {
					controlMouseRobot.mouseMove(carrier.getMouseX(), carrier.getMouseY());
				}

				if (carrier.getMousePressBtn() != -1) {
					controlMouseRobot.mousePress(carrier.getMousePressBtn());
				}

				if (carrier.getMouseReleaseBtn() != -1) {
					controlMouseRobot.mouseRelease(carrier.getMouseReleaseBtn());
				}

				if (carrier.getWheelAmt() != -1) {
					controlMouseRobot.mouseWheel(carrier.getWheelAmt());
				}

				for (Integer pressKey : carrier.getKeyPressCode()) {
					controlMouseRobot.keyPress(pressKey);
				}

				for (Integer releaseKey : carrier.getKeyReleaseCode()) {
					controlMouseRobot.keyRelease(releaseKey);
				}

				Dimension desktopSize = Toolkit.getDefaultToolkit().getScreenSize();
				BufferedImage curDesktop = controlMouseRobot.createScreenCapture(new Rectangle(desktopSize));
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				ImageIO.write(curDesktop, "jpg", out);
				ControlCarrier desktopState = new ControlCarrier();
				desktopState.setDesktopImg(out.toByteArray());

				response = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
				response.writeObject(desktopState);
				response.flush();

			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} finally {

				if (request != null) {
					try {
						request.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}

				if (response != null) {
					try {
						response.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}

	}

	public static void main(String[] args) {
		Server server;
		try {

			String ip = JOptionPane.showInputDialog("请输入本地IP");
			if ("null".equals(ip)) {
				System.exit(0);
			}
			while (ip.isEmpty()) {
				ip = JOptionPane.showInputDialog("请输入本地IP");
			}
			while (!StringUtil.isValidIP(ip)) {
				ip = JOptionPane.showInputDialog("请输入合法IP");
			}

			String port = JOptionPane.showInputDialog("请输入本地端口");
			if ("null".equals(port)) {
				System.exit(0);
			}
			while (port.isEmpty()) {
				port = JOptionPane.showInputDialog("请输入本地端口");
			}
			while (!StringUtil.isValidPort(port)) {
				port = JOptionPane.showInputDialog("请输入合法端口");
			}
			while (!StringUtil.isPortUsed(Integer.parseInt(port))) {
				port = JOptionPane.showInputDialog("端口被占用,请输入其他端口");
			}
			server = new Server(ip, Integer.parseInt(port));
			server.start();
			
			JFrame frame = new JFrame("远程连接被控制端");
			frame.add(server);
			frame.setSize(300,85);
			frame.setDefaultCloseOperation(3);
			frame.setVisible(true);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}

}

 

package org.fw.qq.plugins.remoteassistance.demo;

import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

import org.fw.qq.plugins.remoteassistance.Client;
import org.fw.qq.plugins.remoteassistance.Server;
import org.fw.qq.plugins.remoteassistance.StringUtil;

public class RemoteAssistance extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = -502914245090231502L;
	private JRadioButton serverJRB;
	private JRadioButton clientJRB;
	private ButtonGroup btnGroup;
	private JLabel infoJL;
	private JButton okBtn;

	public RemoteAssistance() {

		initComponent();
		registerListeners();

	}

	private void registerListeners() {
		okBtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if (serverJRB.isSelected()) {
					createServer();
				} else if (clientJRB.isSelected()) {
					createClient();
				}
			}

			private void createClient() {
				JFrame frame = new JFrame("远程控制");
				String ip = JOptionPane.showInputDialog("请输入远程连接IP");
				if ("null".equals(ip)) {
					System.exit(0);
				}
				while (ip.isEmpty()) {
					ip = JOptionPane.showInputDialog("请输入远程连接IP");
				}
				while (!StringUtil.isValidIP(ip)) {
					ip = JOptionPane.showInputDialog("请输入合法IP");
				}

				String port = JOptionPane.showInputDialog("输入远程连接端口");
				if ("null".equals(port)) {
					System.exit(0);
				}
				while (port.isEmpty()) {
					port = JOptionPane.showInputDialog("请输入远程连接端口");
				}
				while (!StringUtil.isValidPort(port)) {
					port = JOptionPane.showInputDialog("请输入合法端口");
				}
				JOptionPane.showMessageDialog(null, "开始远程连接!");

				Client client = new Client(ip, Integer.parseInt(port));
				JScrollPane jsp = new JScrollPane(client, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
				frame.add(jsp);
				frame.setDefaultCloseOperation(3);
				frame.setSize(800, 600);
				frame.setVisible(true);
			}

			private void createServer() {
				Server server;
				try {

					String ip = JOptionPane.showInputDialog("请输入本地IP");
					if ("null".equals(ip)) {
						System.exit(0);
					}
					while (ip.isEmpty()) {
						ip = JOptionPane.showInputDialog("请输入本地IP");
					}
					while (!StringUtil.isValidIP(ip)) {
						ip = JOptionPane.showInputDialog("请输入合法IP");
					}

					String port = JOptionPane.showInputDialog("请输入本地端口");
					if ("null".equals(port)) {
						System.exit(0);
					}
					while (port.isEmpty()) {
						port = JOptionPane.showInputDialog("请输入本地端口");
					}
					while (!StringUtil.isValidPort(port)) {
						port = JOptionPane.showInputDialog("请输入合法端口");
					}
					while (!StringUtil.isPortUsed(Integer.parseInt(port))) {
						port = JOptionPane.showInputDialog("端口被占用,请输入其他端口");
					}
					server = new Server(ip, Integer.parseInt(port));
					server.start();

					JFrame frame = new JFrame("远程连接被控制端");
					frame.add(server);
					frame.setSize(300, 85);
					frame.setDefaultCloseOperation(3);
					frame.setVisible(true);
				} catch (IOException e) {
					e.printStackTrace();
				} catch (AWTException e) {
					e.printStackTrace();
				}
			}

		});
	}

	private void initComponent() {
		infoJL = new JLabel("请选择");
		btnGroup = new ButtonGroup();
		serverJRB = new JRadioButton("被控制者");
		serverJRB.setSelected(true);
		clientJRB = new JRadioButton("控制端");
		btnGroup.add(serverJRB);
		btnGroup.add(clientJRB);
		okBtn = new JButton("确定");
		setLayout(new FlowLayout());
		this.add(infoJL);
		this.add(serverJRB);
		this.add(clientJRB);
		this.add(okBtn);
	}

	public static void main(String[] args) {
		RemoteAssistance demo = new RemoteAssistance();
		demo.setTitle("远程协助");
		demo.setDefaultCloseOperation(3);
		demo.setSize(320, 240);
		demo.setVisible(true);
	}

}

 

package org.fw.qq.plugins.remoteassistance;

import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtil {

	/*
	 * 检测端口是否被用
	 */
	public static boolean isPortUsed(int port) {
		try {
			DatagramSocket socket = new DatagramSocket(port);
			socket.close();
			return true;
		} catch (SocketException e) {
			return false;
		}
	}

	public static boolean isValidIP(String ipAddress) {
		String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
		Pattern pattern = Pattern.compile(ip);
		Matcher matcher = pattern.matcher(ipAddress);
		return matcher.matches();
	}

	public static boolean isValidPort(String port) {
		try {
			int temp = Integer.parseInt(port);
			if (temp > 0 && temp < 65535)
				return true;
		} catch (Exception e) {
			return false;
		}
		return false;
	}
}

 效果图:



 

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 局域网 远程控制] 推荐:

Java局域网远程控制

- - ITeye博客
JOptionPane.showMessageDialog(null, "被控制端已断开连接,或网络异常!");. JFrame frame = new JFrame("远程控制");. String ip = JOptionPane.showInputDialog("请输入远程连接IP");. ip = JOptionPane.showInputDialog("请输入远程连接IP");.

远程控制软件列表

- 董玉伟 - 素包子
想收集一个远程控制软件的列表,会在软件安装卸载列表出现的,特别是能穿透nat回连到外网的,欢迎大家补全,特别是国产的. 回头要把他们回连的站点也拎出来. 向日葵 logmein (竟然是上市公司) TeamViewer 各种VNC gotoassist live mesh softether 反向的VPN logmein旗下的hamachi 反向VPN crossloop http://www.crossloop.com/howto/access_codes?src=hp 这里有几十个老外的远程控制软件列表.

Android手机远程控制电脑

- - Wing的风言风语
人类总是有一股很强的控制欲,就像三体里面很多人抢着当执剑人一样,尽管执剑人的生活估计在地狱都很难找到. 用电脑控制另一台电脑显然已经不能满足我们了,于是就想到了用手机远程控制电脑,这里介绍两款免费的Android手机的软件. 官方网址: http://www.teamviewer.com/zhCN/index.aspx.

西门子推出 iPad 家电远程控制系统 homeConnect

- HUan - Engadget 中国版
如今移动平板设备已经深入生活,那么如何让它和我们的家用电器进行沟通呢. Siemens 西门子在 IFA 上给了我们答案,他们发布了 homeConnect ,又名「远程厨房」. 也就是说你可以远程操控你家厨房的洗碗机和烹饪,当然,是通过 iPad 来完成. 应用系统可以接管你家的厨房电器,可以查看电量使用情况,远程关闭电源,如果碗洗好了你会得到通知.

向日葵手机远程控制Android版

- nikelius - cnBeta全文版
给大家隆重介绍下向日葵的手机版,这是通过某支付公司组织的开发者沙龙上找向日葵的产品经理拿到的向日葵Andriod手机内部版,用了一下很易上手,而且跟现在流行的多点触摸屏做到了流畅的融合. 下载地址: http://u.115.com/file/aqzs2jq8. 要控制远程主机只装这个东东可不行,先到向日葵官网上下载向日葵被控端程序,安装到要控制的主机上.

TeamViewer-电脑远程控制简单应用教程

- ming - iGFW
所谓远程控制,是指管理人员在异地通过计算机网络异地拨号或双方都接入Internet等手段,联通需被控制的计算机,将被控计算机的桌面环境显示到自己的计算机上,通过本地计算机对远方计算机进行配置、软件安装程序、修改等工作. 大家用得最多的远程控制可能就是QQ的远程控制功能了,我自己也用过QQ的这个功能来帮朋友处理一些电脑问题,不过效果不是很好.

Chrome浏览器发布远程控制电脑扩展程序

- -_- - YesKafei Daily
浏览器在互联网中扮演的角色越来越重. Google很早就看到了浏览器的重要性,Google Chrome就好像一部单反,具备卡片欠缺的更多操控性和扩展性. 10月7日,Google推出Chrome扩展程序:Chrome Remote Desktop,实现了通过浏览器就可以远程控制计算机的功能. 目前软件属于测试阶段,支持Windows, Linux, Mac和Chromebooks系统.

Guacamole通过浏览器以网页远程控制电脑

- - IE浏览器中文网站
Guacamole 是一个以 HTML5 为基础的网页应用程序(web application),使用者可以在浏览器中通过这个网页应用程序并配合远程桌面的传输协议(例如 VNC 或 RDP)来操控远程的电脑. 除了网页应用程序之外,Guacamole 也是一个专案名称,这个专案的内容就是发展一套 API 提供给 Guacamole 网页应用程序使用,而这个 API 亦可用于其他类似的应用程序或服务.

Google将发布远程控制和跟踪工具Android Device Manager

- - Solidot
Google宣布,将在本月晚些时候发布寻找丢失手机或平板的应用Android Device Manager. Google官方博客没有透露多少细节,只是表示如果你的手机丢在家中某处,Android Device Manager可以最大手机音量,即使手机处于静音模式也没问题. 如果手机不在听力范围内,你可以在地图上定位它的实时位置.

Raspberry远程控制 —— 私网地址NAT到公网

- - 掘金后端
树莓派 3B(包含一个8GB内存卡,越大越好). MacOS 10.15.4(Windows 也可,别是树莓派就行). 远程 ssh 连接树莓派. 推荐下载官方提供的 raspbain 系统,后期可以通过修改 SD 卡中的配置文件,连接上 WIFI 网络. 如果手头的开发机系统是 *inux ,可以使用dd命令来将镜像烧写到 SD 卡.