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;
}
}
效果图: