客户端:
Client
package com.xdy.local;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 8888);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ClientWindow clientWindow = new ClientWindow(objectOutputStream);
System.out.println("连接成功");
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
byte[] img ;
while(true){
img = new byte[dataInputStream.readInt()];
dataInputStream.readFully(img);
clientWindow.repaintImg(img);
}
}
}
ClientWindow
package com.xdy.local;
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.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
* 控制端窗体类
*
* @author asus
*
*/
public class ClientWindow extends JFrame {
private JLabel background;// 背景标签
private ObjectOutputStream objectOutputStream;
public ClientWindow(ObjectOutputStream objectOutputStream) {
this.objectOutputStream = objectOutputStream;
this.setTitle("远程协助");
this.setSize(1024, 668);
// 设置居中
this.setLocationRelativeTo(null);
background = new JLabel();
// 容器
JPanel pane = new JPanel();
pane.add(background);
// 滚动条
JScrollPane jScrollPane = new JScrollPane(pane);
this.add(jScrollPane);
//键盘事件
this.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
sendEvent(e);
}
public void keyPressed(KeyEvent e) {
sendEvent(e);
}
});
//鼠标操作监听
background.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {
sendEvent(e);
}
public void mousePressed(MouseEvent e) {
sendEvent(e);
}
public void mouseExited(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
});
//鼠标移动监听
background.addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent e) {
sendEvent(e);
}
public void mouseDragged(MouseEvent e) {
sendEvent(e);
}
});
// 关闭退出进程
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void repaintImg(byte[] img) {
background.setIcon(new ImageIcon(img));
this.repaint();
}
public void sendEvent(InputEvent e){
try {
objectOutputStream.writeObject(e);
objectOutputStream.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
服务端
Server.java
package com.xdy.remote;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器在8888端口监听^_^");;
Socket socket = serverSocket.accept();
System.out.println("对接成功^_^---IP地址:【"+socket.getInetAddress()+"】");;
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
ImageThread imageThread = new ImageThread(dataOutputStream);
imageThread.start();
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
EventThread eventThread = new EventThread(objectInputStream);
eventThread.start();
}
}
EventThread.java
package com.xdy.remote;
import java.awt.AWTException;
import java.awt.Event;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.ObjectInputStream;
/**
* 读取事件
* @author asus
*
*/
public class EventThread extends Thread {
private ObjectInputStream objectInputStream;
private Robot robot;
public EventThread(ObjectInputStream objectInputStream) {
super();
this.objectInputStream = objectInputStream;
}
public void run(){
try {
robot = new Robot();
InputEvent inputEvent;
while(true){
inputEvent = (InputEvent) objectInputStream.readObject();
actionEvent(inputEvent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//键盘事件
public void actionEvent(InputEvent e){
if(e instanceof KeyEvent){
KeyEvent keyEvent = (KeyEvent) e;
int type = keyEvent.getID();
if(type == Event.KEY_PRESS){
robot.keyPress(keyEvent.getKeyCode());
}else if (type == Event.KEY_RELEASE) {
robot.keyRelease(keyEvent.getKeyCode());
}
}else if(e instanceof MouseEvent){
MouseEvent mouseEvent = (MouseEvent) e;
int type = mouseEvent.getID();
if(type==Event.MOUSE_DOWN){
robot.mousePress(getMouseButton(mouseEvent.getButton()));
}else if (type == Event.MOUSE_UP) {
robot.mouseRelease(getMouseButton(mouseEvent.getButton()));
}else if (type == Event.MOUSE_MOVE) {
robot.mouseMove(mouseEvent.getX(), mouseEvent.getY());
}else if (type == Event.MOUSE_DRAG) {
robot.mousePress(getMouseButton(mouseEvent.getButton()));
}
}
}
public int getMouseButton(int button){
if(button == MouseEvent.BUTTON1){
return InputEvent.BUTTON1_MASK;
}else if (button == MouseEvent.BUTTON2) {
return InputEvent.BUTTON2_MASK;
}else if (button == MouseEvent.BUTTON3) {
return InputEvent.BUTTON3_MASK;
}else{
return -1;
}
}
}
ImageThread.java
package com.xdy.remote;
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import com.sun.image.codec.jpeg.*;
/**
* 本地图片传输线程
*
* @author asus
*
*/
public class ImageThread extends Thread {
private DataOutputStream dataOutputStream;
public ImageThread(DataOutputStream dataOutputStream) {
super();
this.dataOutputStream = dataOutputStream;
}
@Override
public void run() {
try {
Robot robot = new Robot();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension dimension = toolkit.getScreenSize();//获取屏幕尺寸分辨率
Rectangle rectangle = new Rectangle(dimension);
BufferedImage bufferedImage;
byte[] imgBytes;
while(true){
bufferedImage = robot.createScreenCapture(rectangle);
imgBytes = getBytesImage(bufferedImage);
//传递图片数组大小
dataOutputStream.writeInt(imgBytes.length);
//传递图片
dataOutputStream.write(imgBytes);
//手动清空缓存空间
dataOutputStream.flush();
Thread.sleep(80);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将缓存中的图片转换成二进制数组
* @param bufferedImage
* @return
* @throws ImageFormatException
* @throws IOException
*/
private byte[] getBytesImage(BufferedImage bufferedImage) throws ImageFormatException, IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
encoder.encode(bufferedImage);
return baos.toByteArray();
}
}