`

Socket与ServerSocket远程桌面

    博客分类:
  • Java
 
阅读更多

目的:通过socket与socketserver的通信实现远程监控

 

首先,在serversocket(被监控端)一直截屏发送到socket。

再到socket(客户端)中不断接收截屏内容并展示出来。

 

代码如下:

服务器:

public class RemoteServer {

	private static Socket st;

	public static void main(String[] args) {
		ServerSocket server;
		try {
			server = new ServerSocket(1234);
			st = server.accept();
			System.out.println("已连接");
			// 新开两个线程,一个发送截屏,一个接收鼠标键盘并进行模拟操作
			new SendThread(st).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


class SendThread extends Thread {
	Robot robot;
	ObjectOutputStream os;
	BufferedOutputStream bos;
	ImageOutputStream ios;
	Rectangle rect;
	private boolean isAlive = true;
	Socket st;

	public SendThread(Socket st) {
		this.st = st;
		try {

			robot = new Robot();
			Point p = new Point(0, 0);
			// 获得屏幕大小
			Toolkit tool = Toolkit.getDefaultToolkit();
			Dimension dis = tool.getScreenSize();
			rect = new Rectangle(p, dis);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void run() {
		try {
			os = new ObjectOutputStream(st.getOutputStream());
			BufferedImage img = null;
			while (isAlive) {
				// 根据矩形rect大小进行截屏,得到BUfferedImage对象
				img = robot.createScreenCapture(rect);
				// BUfferedImage没有序列化,先包装成ImageIcon再写出去
				ImageIcon icon = new ImageIcon(img);
				os.writeObject(icon);
				os.flush();
				Thread.sleep(1000);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

客户端:

重写重绘的方法。

public class RemoteClient extends JFrame {

	private JPanel contentPane;
	Socket socket;
	ObjectInputStream ins;
	boolean isAlive = true;
	private ImageIcon icon;

	public static void main(String[] args) {
		Socket socket = null;
		try {
			socket = new Socket("127.0.0.1", 1234);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		new RemoteClient(socket);
	}

	/**
	 * Create the frame.
	 */
	public RemoteClient(Socket socket) {
		this.socket = socket;
		try {
			ins = new ObjectInputStream(socket.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(0, 0, 1200, 700);
		contentPane = new MyPanel();

		JScrollPane jsp = new JScrollPane(contentPane);
		jsp.setAutoscrolls(true);
		add(jsp);
		setVisible(true);
		new Receive().start();
	}

	/**
	 * 接收服务器的图片
	 * 
	 * @author Huangbin
	 * @date 2014年7月31日
	 */
	class Receive extends Thread {

		public void run() {
			try {
				while (isAlive) {
					System.out.println("开始读");
					icon = (ImageIcon) ins.readObject();
					System.out.println(icon);
					System.out.println("读完了");
					// 根据图片大小定义contentPane大小。
					contentPane.setSize(icon.getIconWidth(),
							icon.getIconHeight());
					contentPane.repaint();
					Thread.sleep(1000);
				}
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		}
	}

	class MyPanel extends JPanel {
		public void paint(Graphics g) {
			super.paint(g);
			g.drawImage(icon.getImage(), 0, 0, contentPane);
		}
	}

}

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics