目的:通过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);
}
}
}