首页 > 代码库 > java实现屏幕共享的小程序
java实现屏幕共享的小程序
最近在做软件软件工程的课程设计,做一个用于实验室的屏幕监控系统,参考各种前人代码,最后领悟之后要转换自己的代码,初学者都是这样模仿过来的。
说到屏幕监控系统,有教师断和学生端,教师端就是Server端,学生端就做Client端。系统里比较有趣的一个地方应该算是屏幕广播与屏幕监控吧,其余什么点名签到,锁屏,定时关机的,就相对来说简单点。
屏幕广播,在功能实现上面,说白了,就是教师端的机器不断截取屏幕信息,以图片的形式发送到每一个学生端的电脑上面,由此学生能够看见老师在电脑上的操作,这就是所谓的屏幕广播。
这里面有个麻烦的地方,就是截取屏幕图片的时候,是没有鼠标信息。不过有两种解决办法:
①在发送截图信息时,在图片上绘制一个鼠标,这样在学生端就会有两个鼠标,学生端可以移动自己电脑上的鼠标。
②发送教师端的鼠标坐标到学生端上,学生端的电脑鼠标根据坐标信息实时移动,这里其实是涉及到控制的功能了,学生端就不能移动鼠标了。
屏幕监控相对棘手点,其实这是这包含俩功能:①教师监控所有学生电脑屏幕的功能;②教师控制某一个学生的电脑; 因为涉及到并发,每个client都要实时的把屏幕信息发到教师端上,会有点麻烦,不过还是可以实现。
暂时实现了不带鼠标的屏幕共享功能,比较简单,有待完善,不过可以作为一个工具类在后面集成使用。
首先是教师端Server:
package Test;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import javax.imageio.ImageIO;/* * ly 2014-11-20 * 该类实时发送截屏消失,多线程实现,不包含鼠标信息,且没有做对每个Client做优化处理 */public class SendScreenImg extends Thread{ public static int SERVERPORT=8000; private ServerSocket serverSocket; private Robot robot; public Dimension screen; public Rectangle rect ; private Socket socket; public static void main(String args[]) { new SendScreenImg(SERVERPORT).start(); } //构造方法 开启套接字连接 机器人robot 获取屏幕大小 public SendScreenImg(int SERVERPORT) { try { serverSocket = new ServerSocket(SERVERPORT); serverSocket.setSoTimeout(864000000); robot = new Robot(); } catch (Exception e) { e.printStackTrace(); } screen = Toolkit.getDefaultToolkit().getScreenSize(); //获取主屏幕的大小 rect = new Rectangle(screen); //构造屏幕大小的矩形 } @Override public void run() { //实时等待接收截屏消息 while(true) { try{ socket = serverSocket.accept(); System.out.println("学生端口已经连接"); ZipOutputStream zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream())); zip.setLevel(9); //设置压缩级别 BufferedImage img = robot.createScreenCapture(rect); zip.putNextEntry(new ZipEntry("test.jpg")); ImageIO.write(img, "jpg", zip); if(zip!=null)zip.close(); System.out.println("Client正在实时连接"); } catch (IOException ioe) { System.out.println("连接断开"); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) {e.printStackTrace();} } } } }}
然后是学生端Client:
package Test;import java.awt.Frame;import java.awt.Image;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.DataInputStream;import java.io.IOException;import java.net.Socket;import java.util.concurrent.TimeUnit;import java.util.zip.ZipInputStream;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;/* * ly 2014-11-20 * 该类用于接收教师端的屏幕信息,不包括鼠标,待优化 */public class ReceiveImages extends Thread{ public BorderInit frame ; public Socket socket; public String IP; public static void main(String[] args){ new ReceiveImages(new BorderInit(), "127.0.0.1").start(); } public ReceiveImages(BorderInit frame,String IP) { this.frame = frame; this.IP=IP; } public void run() { while(frame.getFlag()){ try { socket = new Socket(IP,8000); DataInputStream ImgInput = new DataInputStream(socket.getInputStream()); ZipInputStream imgZip = new ZipInputStream(ImgInput); imgZip.getNextEntry(); //到Zip文件流的开始处 Image img = ImageIO.read(imgZip); //按照字节读取Zip图片流里面的图片 frame.jlbImg.setIcon(new ImageIcon(img)); System.out.println("连接第"+(System.currentTimeMillis()/1000)%24%60+"秒"); frame.validate(); TimeUnit.MILLISECONDS.sleep(50);// 接收图片间隔时间 imgZip.close(); } catch (IOException | InterruptedException e) { System.out.println("连接断开"); }finally{ try { socket.close(); } catch (IOException e) {} } } }}//Client端窗口辅助类,专门用来显示从教师端收到的屏幕信息class BorderInit extends JFrame{ private static final long serialVersionUID = 1L; public JLabel jlbImg; private boolean flag; public boolean getFlag(){ return this.flag; } public BorderInit() { this.flag=true; this.jlbImg = new JLabel(); this.setTitle("远程监控--IP:" + "--主题:" ); this.setSize(400, 400); //this.setUndecorated(true); //全屏显示,测试时最好注释掉 //this.setAlwaysOnTop(true); //显示窗口始终在最前面 this.add(jlbImg); this.setLocationRelativeTo(null); this.setExtendedState(Frame.MAXIMIZED_BOTH); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.setVisible(true); this.validate(); //窗口关闭事件 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { flag=false; BorderInit.this.dispose(); System.out.println("窗体关闭"); System.gc(); //垃圾回收 } }); }}
很晚了,从未成品中抽取了这么个小功能,因为答应某位童鞋给链接的,距离成品还有很多要写,后续补上吧。
java实现屏幕共享的小程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。