1,编写一个视屏监控软件,远程监控实时画面
初步实现的功能
分析;服务器;截取屏幕 通过对象流写出去
客户端;读取服务器发送过来的数据,并且显示在指定的位置
服务器可以点击打开客户端的应用
代码如下
package 监控服务器v1; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /* * * 服务器入口 */ public class MyServer { public static void main(String[] args) { //创建服务器套接字 try { ServerSocket server = new ServerSocket(8080); System.out.println("等待客户端连接..."); //等待客户端连接 Socket socket = server.accept(); System.out.println(socket.getRemoteSocketAddress()+"连接上服务器"); //获得输出流,包装成对象流 OutputStream ops = socket.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(ops); //启动发送消息的线程 SendThread sendthread = new SendThread(oos); sendthread.start(); //创建收鼠标消息的输入流 InputStream is= socket.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); //接受鼠标消息的线程 ReceiverThread receiverthread = new ReceiverThread(ois); receiverthread.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package 监控服务器v1; 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.ObjectOutputStream; import javax.swing.ImageIcon; /** * * @author Administrator *服务器截屏,发送 */ public class SendThread extends Thread{ private boolean islive = true; private ObjectOutputStream oos; public SendThread(ObjectOutputStream oos){ this.oos = oos; } public void run(){ while(islive){ try { //使用Robot截取屏幕 Robot robot = new Robot(); //获得屏幕分辨率 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); //截取的矩形 Rectangle rect = new Rectangle(0, 0, dim.width, dim.height); //保存图片 BufferedImage image = robot.createScreenCapture(rect); //图片装成ImageIcon来保存 ImageIcon icon = new ImageIcon(image); //将图片写出去 if(icon!=null){ oos.writeObject(icon); oos.flush(); Thread.sleep(500); }else{ } } catch (Exception e) { islive = false; // TODO Auto-generated catch block System.out.println("丢失客户端..."); } } } }
package 监控服务器v1; /** * 服务器收鼠标数据的线程 */ import java.awt.Robot; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.io.ObjectInputStream; public class ReceiverThread extends Thread { private ObjectInputStream ois; private boolean islive = true; public ReceiverThread(ObjectInputStream ois) { this.ois = ois; } // 线程接受数据 @Override public void run() { try { Robot robot = new Robot(); while (islive) { int x = ois.readInt(); int y = ois.readInt(); int button = ois.readInt(); String type = (String) ois.readObject(); int btn = 0; if (button == MouseEvent.BUTTON1) { btn = InputEvent.BUTTON1_MASK; } else if (button == MouseEvent.BUTTON3) { btn = InputEvent.BUTTON3_MASK; } if (type.equals("Released")) { robot.mouseMove(x, y); robot.mousePress(btn); } else if (type.equals("Pressed")) { robot.mouseMove(x, y); robot.mousePress(btn); } } } catch (Exception e1) { islive = false; e1.printStackTrace(); } } }
客户端
package 监控客户端v1; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.Socket; import javax.management.modelmbean.ModelMBean; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; /** * * @author Administrator 客户端界面 */ public class ClientUI extends JFrame { JPanel panel = new JPanel(); private ObjectOutputStream oos; public static void main(String[] args) { new ClientUI(); } private JTextField ipfield; private JTextField portfield; // 构造函数 public ClientUI() { this.setSize(600, 500); this.setTitle("监控客户端"); this.setLayout(new BorderLayout()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示区域中间 JScrollPane jsp = new JScrollPane(panel); jsp.setAutoscrolls(true); panel.setBackground(Color.WHITE); this.add(jsp, BorderLayout.CENTER); // 按钮区域 JPanel tool = new JPanel(); tool.setBackground(Color.GRAY); tool.setPreferredSize(new Dimension(1, 80)); this.add(tool, BorderLayout.SOUTH); // 在按钮区域添加ip和端口的输入框 JLabel ipLabel = new JLabel("ip:"); ipfield = new JTextField("127.0.0.1", 20); JLabel portLabel = new JLabel("port:"); portfield = new JTextField("8080", 10); JButton btn = new JButton("连接服务器"); // 将按钮区域的文本,输入框,按钮 添加到按钮区域 tool.add(ipLabel); tool.add(ipfield); tool.add(portLabel); tool.add(portfield); tool.add(btn); this.setVisible(true); // 创建监听器对象给按钮添加监听器 BtnLisener btnlis = new BtnLisener(); btn.addActionListener(btnlis); //创建鼠标监听器对象,并添加d } /** * * @author Administrator 添加鼠标监听器 */ class panelMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); int button = e.getButton(); String type = "Pressed"; try { if(oos!=null){ oos.writeInt(x); oos.writeInt(y); oos.writeInt(button); oos.writeObject(type); oos.flush(); }else{ JOptionPane.showMessageDialog(null,"与服务器断开"); } } catch (Exception e2) { e2.printStackTrace(); } } public void mouseReleased(MouseEvent e) { int x = e.getX(); int y = e.getY(); int button = e.getButton(); String type = "Released"; try { if(oos!=null){ oos.writeInt(x); oos.writeInt(y); oos.writeInt(button); oos.writeObject(type); oos.flush(); }else{ JOptionPane.showMessageDialog(null,"与服务器断开"); } } catch (Exception e2) { e2.printStackTrace(); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } //119.39.86.222 public void mouseWheelMoved(MouseWheelEvent e) { } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } } /** * * @author Administrator 添加按钮监听器 */ class BtnLisener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // 获得默认按钮 String command = e.getActionCommand(); // 获得事件源 JButton btn = (JButton) e.getSource(); // 获取输入框中的字符串 String ip = ipfield.getText().trim(); String ports = portfield.getText().trim(); // 端口是int型 int port = Integer.parseInt(ports); if (command.equals("连接服务器")) { try { Socket socket = new Socket(ip, port); btn.setText("连接上服务器"); // 创建输入流得到服务器的图片 InputStream is = socket.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); // 启动接收数据线程 ClientThread th = new ClientThread(ois, panel); th.start(); //创建输出流,将鼠标信息写出去 OutputStream os=socket.getOutputStream(); oos = new ObjectOutputStream(os); } catch (Exception e1) { e1.printStackTrace(); } } } } }
package 监控客户端v1; import java.awt.Dimension; import java.awt.Graphics; import java.io.ObjectInputStream; import javax.swing.ImageIcon; import javax.swing.JPanel; /** * * @author Administrator 客户端收消息 */ public class ClientThread extends Thread { private ObjectInputStream ois; private JPanel panel; private boolean islive = true; public ClientThread(ObjectInputStream ois, JPanel panel) { this.ois= ois; this.panel = panel; } // 线程收消息 public void run() { while (islive) { try { //读取图片 ImageIcon icon = (ImageIcon)ois.readObject(); //根据读取到的图片设置图片大小 Dimension dim = new Dimension(icon.getIconWidth(), icon.getIconHeight()); Graphics g = panel.getGraphics(); g.drawImage(icon.getImage(), 0, 0, null); Thread.sleep(500); } catch (Exception e) { islive = false; // TODO Auto-generated catch block e.printStackTrace(); } } } }
由于是在本电脑上运行的,结果可能不太明显;
相关推荐
本文将深入探讨"视屏监控(基于TCP/IP一)"的相关知识点。 1. **TCP/IP协议**:TCP/IP(Transmission Control Protocol/Internet Protocol)是互联网上应用最广泛的一组通信协议,它定义了电子设备如何在网络中交换...
【标题】:“视屏监控客服端” 在信息技术领域,视频监控客户端是一种用于远程查看和管理摄像头设备的应用程序。本文将详细解析基于TQ2440开发板与Windows下的QT客户端的视频监控程序及其工作原理。 【描述】:...
【基于ARM的网络视频监控系统】是一种集成硬件和软件的智能监控解决方案,它利用了ARM(Advanced RISC Machines)架构的处理器,这种处理器在嵌入式系统中广泛应用,以其高效能和低功耗特性著名。该系统的核心在于将...
Qt的网络模块支持TCP/IP通信,便于视频流的传输和控制命令的发送。 3. **Java**:Java作为服务器端编程语言,可以用于处理视频流的编码、解码、压缩和解压缩,以及数据存储和用户权限管理等。例如,使用Spring Boot...
Winsock是Windows平台上的网络通信接口,提供了TCP/IP协议栈的访问。服务端和客户端都需要用到Winsock来建立连接,发送和接收数据。 五、多线程技术 由于视频流处理和用户界面更新需要同时进行,因此在MFC中通常会...
6. **应用与监控**:在确认通讯无误后,昆仑通态触摸屏就可以在生产现场作为人机交互界面,实时监控和控制欧姆龙PLC了。 教程文件“教程_嵌_连接欧姆龙PLC.MCE”应该包含详细的操作步骤和实例,指导用户如何进行...
这两部分之间的通信可能基于TCP/IP协议,确保数据的可靠传输,或者使用UDP协议以实现更低的延迟。 "CJLibrary608c"可能是一个第三方库,用于辅助处理视频编解码或者网络通信。在C#中,这样的库可以大大简化开发者的...
4. **104规约**:104规约,即《IEC 60870-5-104》,是一种基于TCP/IP的网络通信协议,适应了电力系统向数字化、网络化的转型需求。与101规约相比,104规约提供了更高效、可靠的数据传输,支持多路并发通信,适合于大...
- **图像传输设计**:考虑到网络带宽限制等因素,采用适当的传输协议(如TCP/IP)进行优化处理,保证视频流传输的流畅性。 #### 6. 视频采集系统测试 - 对已完成的视频采集系统进行全面的功能性和性能测试,包括但...
过日志可以准确定位到具体人,特别是对于网络内通过IP修改进行逃避监控的,就可以通过IP和MAC地址 绑定进行有效管理; 网络报警: 可以通过TCP、UDP和ICMP在一分钟内一直超过某个值进行报警,也可以通过单机一...
该功能对于多网段环境,针对具体机器进行流速控制和其他针对性强的控制是必需的,同时通过日志可以准确定位到具体人,特别是对于网络内通过IP修改进行逃避监控的,就可以通过IP和MAC地址绑定进行有效管理;...