(4)java开发远程协助

客户端:

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();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值