服务端程序:
第一步创建服务器套接字(程序如下):
ServerSocket server = new ServerSocket(10086);//里面传指定的端口号
第二步等待客服端连接(代码如下):
Socket socket = server.accept();
第三步创建一个发送数据的线程和一个接受数据的线程:(代码如下)
1.1.服务端向客服端发送数据
public class SendThread extends Thread{ Socket sk; public SendThread(Socket sk){ this.sk = sk; } public void run(){ try { //从套接字上获得输出流 OutputStream os = sk.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); //创建一个机器人对象 Robot rt = new Robot(); while(true){ //获得频幕分辨率 Toolkit tool = Toolkit.getDefaultToolkit(); Dimension sion = tool.getScreenSize(); //截取起点 Point p = new Point(0,0); //指定截取的区域 Rectangle rect = new Rectangle(p,sion); //开始截屏,获得截取的图像 BufferedImage img = rt.createScreenCapture(rect); ImageIcon icon = new ImageIcon(img); oos.writeObject(icon); oos.flush(); Thread.sleep(500); } } catch (Exception e) { e.printStackTrace(); } } }
一定要记得创建机器人对象,只有通过机器人对象才能不断的去截取屏幕图像。
1.2 创建客服端套接字:
Socket socket = new Socket(ip,intport);
发送数据一定要把数据包装成对象流:
OutputStream ops = socket.getOutputStream();
oos = new ObjectOutputStream(ops);
然后启动线程不断接受从服务端发来的数据(图片)
public class RecieveThread extends Thread {
Socket socket;
JPanel panel;
public RecieveThread(Socket socket, JPanel panel){
this.socket = socket;
this.panel = panel;
}
public void run(){
try {
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
while(true){
Object ject = ois.readObject();
ImageIcon icon = (ImageIcon)ject;
int width = icon.getIconWidth();
int height = icon.getIconHeight();
panel.setPreferredSize(new Dimension(width,height));
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0, 0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3.服务端接受客服端发来的数据
public class RecieveThread extends Thread{ Socket socket; public RecieveThread(Socket socket){ this.socket= socket; } public void run(){ try { Robot robot = new Robot();//创建一个机器人对象 InputStream ips = socket.getInputStream(); ObjectInputStream ois = new ObjectInputStream(ips); while(true){ int x = ois.readInt(); int y = ois.readInt(); int btnNum = ois.readInt(); String type = (String) ois.readObject(); //这里函数参数对应的鼠标左键中建和右键的值,和鼠标事件得到的值不一样,在这里需要做一下转换 int btnMask = InputEvent.BUTTON1_MASK; //监听客服端的鼠标键 if(btnNum == MouseEvent.BUTTON1){ btnMask = InputEvent.BUTTON1_MASK; }else if(btnMask == MouseEvent.BUTTON2){ btnMask = InputEvent.BUTTON2_MASK; }else if(btnMask == MouseEvent.BUTTON3){ btnMask = InputEvent.BUTTON3_MASK; } if("pressed".equals(type)){ robot.mouseMove(x, y); robot.mouseRelease(btnMask); }else if("released".equals(type)){ robot.mouseMove(x, y); robot.mouseRelease(btnMask); }else if("moved".equals(type)){ robot.mouseMove(x, y); } } } catch (Exception e) { e.printStackTrace(); } } }