该案例主要分为两个类文件,Server及其中的内部类,Client及其中的内部类。

大家可以参考。

如对Java远控比较感兴趣可以到我的网站上看一下

我们最近用Java开发的一款“黑天鹅远控”软件,并且为开源软件。

该案例为该软件中的一个功能点的源代码,并且已经整理成为单独的完善的案例。

我们的官方网站网址: http://www.blackswansoft.com/

你可以在该网站上下载 “黑天鹅远控”软件。网站上发布了更多的java热点技术,欢迎大家参考。

QQ:1037729010

Email: blackswansoft@163.com

/**

*服务端代码

*

*/

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.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.imageio.ImageIO;

public class Server{
 public static void main(String args[]) {
  SendScreenImg sender=new SendScreenImg();
  sender.changeServerPort(30009);//此处可以修改服务端口
  new Thread(sender).start();//打开图像传输服务
  OperateWindow operate=new OperateWindow();
//  operate.changeServerPort(30010);//此处可以修改服务端口
  new Thread(operate).start();//打开主机操控服务
  
  //***** 当然 服务器端的端口修改是随时都可以操作的 它实际上是关闭以前的端口 再开启一个新端口 *****//
 }
}

/**
 * @author LanXJ @doctime 2010-7-8
 * 开启一个设定端口的服务,该服务用于向客户端传送主机的屏幕信息,实现客户端对服务器端主机的监控
 * 实例化线程类后默认打开DEFAULT_SERVER_PORT=30011 端口实现监听
 * 可以通过changeServerPort改变监听端口,也可以通过getServerPort来查询当前监听端口
 */
class SendScreenImg implements Runnable{

public static final int DEFAULT_SERVER_PORT=30011;
 private int serverPort;
 private Robot robot;
 private ServerSocket serverSocket;
 private Rectangle rect;
 private Dimension screen;
 private BufferedImage img;
 private Socket socket;
 private ZipOutputStream zip;

public SendScreenImg() {
  this.serverPort=SendScreenImg.DEFAULT_SERVER_PORT;

try {
   serverSocket = new ServerSocket(this.serverPort);
   serverSocket.setSoTimeout(86400000);
  } catch (IOException e1) {
   e1.printStackTrace();
  }

try {
   robot = new Robot();
  } catch (AWTException e) {
   e.printStackTrace();
  }
  screen = Toolkit.getDefaultToolkit().getScreenSize();
  rect = new Rectangle(screen);

}
 public void changeServerPort(int serverPort){
  if(this.serverPort==serverPort)return;
  this.serverPort=serverPort;
  try {
   this.serverSocket.close();
  } catch (Exception e) {}
  try {
   serverSocket = new ServerSocket(this.serverPort);
   serverSocket.setSoTimeout(86400000);
  } catch (IOException e1) {
   e1.printStackTrace();
  }
 }
 public int getServerPort(){
  return this.serverPort;
 }

public void run() {
  while (true) {
             try {
              System.out.println("等待接收截屏信息");
                 socket = serverSocket.accept();
                 zip = new ZipOutputStream(new DataOutputStream(socket.getOutputStream()));
                 zip.setLevel(9);//为后续的 DEFLATED 条目设置压缩级别 压缩级别 (0-9)
                 try {
                  img = robot.createScreenCapture(rect);
                     zip.putNextEntry(new ZipEntry("test.jpg"));
                     ImageIO.write(img, "jpg", zip);
                     if(zip!=null)zip.close();
                     System.out.println("被控端:connect");
                 } catch (IOException ioe) {
                     System.out.println("被控端:disconnect");
                 }
             } catch (IOException ioe) {
              System.out.println("错误1");
             } finally {
                 if (socket != null) {
                     try {
                         socket.close();
                     } catch (IOException e) {
                     }
                 }
             }
         }
 }
}

/**
 * @author LanXJ @doctime 2010-7-8
 * 开启一个设定端口的服务,该服务用于接受客户端传来的操作字符串,实现对服务器端主机的操控
 * 实例化线程类后默认打开DEFAULT_SERVER_PORT=30012 端口实现监听
 * 可以通过changeServerPort改变监听端口,也可以通过getServerPort来查询当前监听端口
 */
class OperateWindow implements Runnable {
 public static final int DEFAULT_SERVER_PORT=30012;
 private int serverPort;
 private ServerSocket serverSocket;
 private Robot robot;
 public OperateWindow() {
  this.serverPort=OperateWindow.DEFAULT_SERVER_PORT;
  try {
   this.serverSocket = new ServerSocket(this.serverPort);
   this.serverSocket.setSoTimeout(86400000);
  } catch (IOException e) {
   e.printStackTrace();
  }
  try {
   robot = new Robot();
  } catch (AWTException e) {
   e.printStackTrace();
  }
 }
 public void changeServerPort(int serverPort){
  if(this.serverPort==serverPort)return;
  this.serverPort=serverPort;
  try {
   this.serverSocket.close();
  } catch (Exception e) {}
  try {
   this.serverSocket = new ServerSocket(this.serverPort);
   this.serverSocket.setSoTimeout(86400000);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public int getServerPort(){
  return this.serverPort;
 }

public void run() {
  while (true) {
   try {
    Socket socket = serverSocket.accept();
    //读取操作信息:120,200,InputEvent.BUTTON1_DOWN_MASK 全部是int类型
    InputStream is = socket.getInputStream();
    int r;
    String info = "";
    while ((r = is.read()) != -1) {
     info += "" + (char) r;
    }
    System.out.println(info);
    is.close();
    if (info != null) {
     String s[] = info.trim().split(",");
     if ("mouseClicked".equals(s[0].trim())) {//operateStr Model: mouseClicked,x,y,type 
      //由于加上单击事件后,鼠标按下并快速抬起 就设计到按下、抬起、单击 三个事件,将单击变为了双击 不合乎规范  所以 服务端并没有实现单击事件的监听,这里保留 不坐修改
      int type = Integer.parseInt(s[s.length - 1].trim());
      if (s.length == 4) {
       int x = Integer.parseInt(s[1].trim());
       int y = Integer.parseInt(s[2].trim());
       robot.mouseMove(x, y);
       robot.mousePress(type);
       robot.mouseRelease(type);
       System.out.println("ClientINFO:MOUSE move to "+x+","+y+" AND execute TYPE IS click "+type);
      }
     }else if("mousePressed".equals(s[0].trim())){//operateStr Model: mousePressed,x,y,type
      int type = Integer.parseInt(s[s.length - 1].trim());
      if (s.length == 4) {
       int x = Integer.parseInt(s[1].trim());
       int y = Integer.parseInt(s[2].trim());
       robot.mouseMove(x, y);
       robot.mousePress(type);
       System.out.println("ClientINFO:MOUSE move to "+x+","+y+" AND execute TYPE IS press "+type);
      }
     }else if("mouseReleased".equals(s[0].trim())){//operateStr Model: mouseReleased,x,y,type
      int type = Integer.parseInt(s[s.length - 1].trim());
      if (s.length == 4) {
       int x = Integer.parseInt(s[1].trim());
       int y = Integer.parseInt(s[2].trim());
       robot.mouseMove(x, y);
       robot.mouseRelease(type);
       System.out.println("ClientINFO:MOUSE move to "+x+","+y+" AND execute TYPE IS release  "+type);
      }
     }else if("mouseDragged".equals(s[0].trim())){//operateStr Model: mouseDragged,x,y,type
      if (s.length == 4) {
       int x = Integer.parseInt(s[1].trim());
       int y = Integer.parseInt(s[2].trim());
       robot.mouseMove(x, y);
       System.out.println("ClientINFO:MOUSE move to "+x+","+y );
      }
     }else if("mouseMoved".equals(s[0].trim())){
      if (s.length == 3) {
       int x = Integer.parseInt(s[1].trim());
       int y = Integer.parseInt(s[2].trim());
       robot.mouseMove(x, y);
       System.out.println("ClientINFO:MOUSE move to "+x+","+y);
      }
     }else if("keyPress".equals(s[0].trim())){
      if(s.length==2){
       int keycode=Integer.parseInt(s[1]);
       robot.keyPress(keycode);
      }
     }else if("keyRelease".equals(s[0].trim())){
      if(s.length==2){
       int keycode=Integer.parseInt(s[1]);
       robot.keyRelease(keycode);
      }
     }else if("keyTyped".equals(s[0].trim())){
      if(s.length==2){
       int keycode=Integer.parseInt(s[1]);
       robot.keyPress(keycode);
       robot.keyRelease(keycode);
      }
     }
    }
   } catch (IOException e) {
    System.out.println("error1");
   }
  }
 }
}

/**

*监控端代码

*

*/

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipInputStream;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Client{
 public static void main(String args[]) {

ServerGUI sendOrder=new ServerGUI("127.0.0.1", "实时操控");//被监控电脑的ip地址
  WriteGUI catchScreen=new WriteGUI(sendOrder);
  catchScreen.changePort(30009);//现在可以修改获取主机屏幕信息要访问的端口号
  new Thread(catchScreen).start();//启动线程
 }
}

/**
 * @author LanXJ @doctime 2010-7-8
 * 访问指定端口的服务,从服务器端读取图像流,生成(刷新)管理面板
 * 默认访问的端口为DEFAULT_PORT=30011 端口,
 * 可以通过changePort来改变访问端口,也可以通过getPort查看当前访问端口
 * 实例化线程类时需要传入一个ServerGUI类型的辅助窗体对象
 */
class WriteGUI extends Thread {
 public static final int DEFAULT_PORT=30011;
 private int port;
 private ServerGUI rec;

/**
  * @param rec 辅助窗体对象,可通过实例化获得
  */
 public WriteGUI(ServerGUI rec) {
  this.port=WriteGUI.DEFAULT_PORT;
  this.rec = rec;
 }
 public void changePort(int port){
  this.port=port;
 }
 public int getPort(){
  return this.port;
 }
 public void run() {
  while (rec.getBoo()) {
   System.out.println((System.currentTimeMillis()/1000)%24%60);
   Socket socket = null;
   try {
    socket = new Socket(rec.getIP(), this.port);
    DataInputStream dis = new DataInputStream(socket.getInputStream());
    ZipInputStream zis = new ZipInputStream(dis);
    Image image = null;
    try {
     zis.getNextEntry();// 读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处
     image = ImageIO.read(zis);// 把ZIP流转换为图片
     rec.jlabel.setIcon(new ImageIcon(image));
     rec.scroll.setViewportView(rec.jlabel);
     rec.validate();
    } catch (IOException ioe) {}
    try{
//     dis.close();
     zis.close();
    }catch (Exception e) {}
    try {
     TimeUnit.MILLISECONDS.sleep(50);// 接收图片间隔时间
    } catch (InterruptedException ie) {
     ie.printStackTrace();
    }
   } catch (IOException ioe) {
   } finally {
    try {
     socket.close();
    } catch (IOException e) {}
   }
  }
 }
}

/**
 * @author LanXJ @doctime 2010-7-8
 * 访问指定主机的指定端口,向主机发送实例化线程类时传入的操控命令,实现对该主机的操控
 * 默认访问服务端口为DEFAULT_PORT=30012 端口,主机IP为实例化线程类时传入的IP
 * 可以通过changePort和changeIP来修改访问的端口和主机
 * 也可以通过setOperateStr来设置需要发送的操控命令
 * 需要注意的是,修改访问端口或主机必须在线程启动之前修改,否则修改无效
 */
class SendOperate extends Thread {
 public static int DEFAULT_PORT=30012;
 private String ip;
 private int port;// 30012
 private String operateStr;

public SendOperate(String ip, String operateStr) {
  this.ip = ip;
  this.port = SendOperate.DEFAULT_PORT;
  this.operateStr = operateStr;
 }
 public void setOperateStr(String operateStr){
  this.operateStr=operateStr;
 }
 public void changePort(int port){
  this.port=port;
 }
 public boolean changeIP(String ip){
  if(UtilServer.checkIp(ip)){
   this.ip=ip;
   return true;
  }
  return false;
 }
 public int getPort(){
  return this.port;
 }
 public String getIP(){
  return this.ip;
 }
 public void run() {
  if(this.operateStr==null||this.operateStr.equals("")){
   return;
  }
//  if(this.operateStr.trim().startsWith("mouseMoved")){
//   return;
//  }
  try {
   Socket socket = new Socket(this.ip, this.port);
   OutputStream os = socket.getOutputStream();
   os.write((this.operateStr).getBytes());
   os.flush();
   socket.close();
   System.out.println("INFO: 【SendOperate】ip=" + this.ip + ",port=" + this.port + ",operateStr=/"" + this.operateStr + "/".");
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
}

/**
 * @author LanXJ @doctime 2010-7-8
 * 服务工具类
 */
class UtilServer{
 public static boolean checkIp(String ip){
  if(ip==null)return false;
  String []dps=ip.split("//.");
  if(dps.length!=4&&dps.length!=6)return false;
  boolean isIp=true;
  for (int i = 0; i < dps.length; i++) {
   try {
    int dp=Integer.parseInt(dps[i]);
    if(dp>255||dp< 0){
     throw new RuntimeException("error IP");
    }
   } catch (Exception e) {
    isIp=false;
    break;
   }
  }
  return isIp;
 }
}
/**
 * @author LanXJ @doctime 2010-7-8
 * serverManage的辅助窗体,内部事件封装了sendOperate的实现
 */
class ServerGUI extends JFrame {
 private static final long serialVersionUID = 2273190419221320707L;
 JLabel jlabel;
 JScrollPane scroll;
 private String ip;
 private int port;
 private boolean boo;
 public boolean getBoo(){
  return this.boo;
 }
 public int getPort(){
  return this.port;
 }
 public void changePort(int port){
  this.port=port;
 }
 public String getIP(){
  return this.ip;
 }
 public boolean changeIP(String ip){
  if(UtilServer.checkIp(ip)){
   this.setTitle(this.getTitle().replace(this.ip, ip));
   this.ip=ip;
   return true;
  }
  return false;
 }

protected ServerGUI(String IP, String sub) {
  this.boo = true;
  this.ip = IP;
  this.port=SendOperate.DEFAULT_PORT;
  this.setTitle("远程监控--IP:" + IP + "--主题:" + sub);
  this.jlabel = new JLabel();
  this.scroll = new JScrollPane();
  this.scroll.add(this.jlabel);
  scroll.addMouseListener(new MouseAdapter() {
   /*public void mouseClicked(MouseEvent e) {// getMousePosition()
    super.mouseClicked(e);
    //由于加上单击事件后,鼠标按下并快速抬起 就设计到按下、抬起、单击 三个事件,将单击变为了双击
    //所以不实现单击监听
    int x = (int) e.getX() + (int) ServerGUI.this.scroll.getHorizontalScrollBar().getValue();
    int y = (int) e.getY() + (int) ServerGUI.this.scroll.getVerticalScrollBar().getValue();
//    int type = e.getModifiers();//e.BUTTON1_MASK 或 e.BUTTON2_MASK 或 e.BUTTON3_MASK
    String operateStr ="mouseClicked,"+ x + "," + y + "," + e.getModifiers();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }*/
   
   public void mousePressed(MouseEvent e) {
    super.mousePressed(e);
    int x = (int) e.getX() + (int) ServerGUI.this.scroll.getHorizontalScrollBar().getValue();
    int y = (int) e.getY() + (int) ServerGUI.this.scroll.getVerticalScrollBar().getValue();
//    int type = e.getModifiers();//e.BUTTON1_MASK 或 e.BUTTON2_MASK 或 e.BUTTON3_MASK
    String operateStr ="mousePressed,"+ x + "," + y + "," + e.getModifiers();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
   @SuppressWarnings("static-access")
   public void mouseReleased(MouseEvent e) {
    super.mouseReleased(e);
    int x = (int) e.getX() + (int) ServerGUI.this.scroll.getHorizontalScrollBar().getValue();
    int y = (int) e.getY() + (int) ServerGUI.this.scroll.getVerticalScrollBar().getValue();
//    int type = e.getModifiers();//e.BUTTON1_MASK 或 e.BUTTON2_MASK 或 e.BUTTON3_MASK
    String operateStr ="mouseReleased,"+ x + "," + y + "," + e.getModifiers();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
  });
  scroll.addMouseMotionListener(new MouseMotionAdapter(){
   public void mouseDragged(MouseEvent e) {
    super.mouseDragged(e);
    int x = (int) e.getX() + (int) ServerGUI.this.scroll.getHorizontalScrollBar().getValue();
    int y = (int) e.getY() + (int) ServerGUI.this.scroll.getVerticalScrollBar().getValue();
    String operateStr ="mouseDragged,"+ x + "," + y + "," + e.getModifiers();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, operateStr);
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
   public void mouseMoved(MouseEvent e) {
    super.mouseMoved(e);
    int x = (int) e.getX() + (int) ServerGUI.this.scroll.getHorizontalScrollBar().getValue();
    int y = (int) e.getY() + (int) ServerGUI.this.scroll.getVerticalScrollBar().getValue();
    String operateStr ="mouseMoved,"+ x + "," + y;
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
  });
  this.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent e) {
    super.keyPressed(e);
    String operateStr ="keyPress,"+ e.getKeyCode();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
   public void keyReleased(KeyEvent e) {
    super.keyReleased(e);
    String operateStr ="keyReleas,"+ e.getKeyCode();
    
    SendOperate sender=new SendOperate(ServerGUI.this.ip, (operateStr));
    sender.changeIP(ServerGUI.this.ip);//同步ip
    sender.changePort(ServerGUI.this.port);//同步port
    sender.start();
   }
   public void keyTyped(KeyEvent e) {
//    super.keyTyped(e);
   }
  });
  this.add(scroll);

this.setAlwaysOnTop(false);
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  this.setBounds(100, 75, (int) screenSize.getWidth() - 200, (int) screenSize.getHeight() - 150);
  // this.setResizable(false);
  this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);// 关闭窗体不做任何事
  this.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    boo = false;
    ServerGUI.this.dispose();
    System.out.println("窗体关闭");
    System.gc();
   }
  });
  this.setVisible(true);
  this.validate();

}
}

该案例主要分为两个类文件,Server及其中的内部类,Client及其中的内部类。

大家可以参考。

如对Java远控比较感兴趣可以到我的网站上看一下

我们最近用Java开发的一款“黑天鹅远控”软件,并且为开源软件。

该案例为该软件中的一个功能点的源代码,并且已经整理成为单独的完善的案例。

我们的官方网站网址: http://www.blackswansoft.com/

你可以在该网站上下载 “黑天鹅远控”软件。网站上发布了更多的java热点技术,欢迎大家参考。

QQ:1037729010

Email: blackswansoft@163.com


Java远程屏幕监控案例相关推荐

  1. java远程监控系统代码_[源码和文档分享]基于JAVA的远程屏幕监控系统

    远程屏幕监控系统在生活中是很常见的,学校机房的机房管理系统.PC版QQ的远程演示功能等都属于远程屏幕监控系统.监控系统的原理是通过客户端不断的截取屏幕发送到服务器端,服务器端进而将画面呈现出来的过程. ...

  2. 基于JAVA的远程屏幕监控系统

    摘 要 远程屏幕监控系统在生活中是很常见的,学校机房的机房管理系统.PC版QQ的远程演示功能等都属于远程屏幕监控系统.监控系统的原理是通过客户端不断的截取屏幕发送到服务器端,服务器端进而将画面呈现出来 ...

  3. Node.JS实战34:远程屏幕监控?可以的

    是否想做一个远程系统屏幕监控功能?这是个有意思的功能. Node.JS可以实现,而且很方便. 目标效果: 在网页中实时查看系统屏幕内容. 实现原理: 1.用express实现服务器: 2.当访问来临时 ...

  4. 局域网多媒体教学系统中基于JAVA的屏幕监控

    (1.2.梧州学院计算机与电子信息工程系,广西梧州543002) 1 前言 笔者所介绍的屏幕监控是整个局域网多媒体教学系统的一个子功能,负责把学生端的屏幕图像传输 到教师机并进行实时显示,主要用到屏幕 ...

  5. java 远程视频监控系统_基于android的远程视频监控系统 附完整源码

    [实例简介]原理:客户端将采集到的每一帧图像数据发送至服务器,服务器接收 [实例截图] [核心代码] /* * @version 1.2 2012-06-29 * @author wanghai */ ...

  6. 利用Http实现屏幕监控

    使用了idhttp实现了远程屏幕监控,可以网页使用也可以客户端使用. 文件:url80.ctfile.com/f/25127180-733994640-f168b8?p=551685 (访问密码: 5 ...

  7. 基于JAVA服务器监控系统设计,远程数字图像监控系统中web服务器的设计与实现...

    摘要: 数字图像监控系统在目前处于小规模发展阶段,系统的核心是监控服务器.在一些小规模的应用中,监控服务器同时还充当着监控终端的角色.但是,大部分监控系统都没有考虑用户权限.安全性.收费模式等方面的问 ...

  8. 工控物联网案例-如何利用LTE-658 4G DTU实现水文水利远程物联网监控

    前言 关于LTE-658如何实现水文水资源监控远程监控方案前言该系统能实现从水资源与水环境监测管理业务出发,融合传感.采集.M2M平台.信息汇集处理.水资源调度模型等技术,实现自动化计量.管理以及水质 ...

  9. 配置Java远程监控授权(Java Mission Control)

    配置Java远程监控授权(Java Mission Control) 转载URL:  http://www.icoolxue.com/blog/show/9 最近公司做的项目有比较严重的内存溢出问题, ...

最新文章

  1. 使用树莓派(Raspberry Pi)远程GPIO
  2. buuctf 二维码
  3. Mozilla 构建系统(转)
  4. 项目用的几种机型参数调查
  5. ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core
  6. simulink中不能改名_《和平精英》没有卡如何解决 改名字方法
  7. centos7切换root为mysql,CentOS 7中使用rpm方式安装MySQL 5.7后无法使用root登录解决
  8. 单库单服解决方案terraform部署实践
  9. 运行成功:char转换为wchar_t的代码
  10. 几款web富文本编辑器汇总整理
  11. javaShop JAVA版多用户B2B2C商城源码(PC +H5+小程序+APP)
  12. 嵌入式开发使用虚拟机的基本服务安装
  13. 一文看懂线性回归和非线性回归
  14. 图解最常用的 10 个机器学习算法
  15. fence_ipmilan 的一个缺陷
  16. 计算机网络考试数据包格式,计算机网络实验 分析ICMP协议数据包格式.doc
  17. 扣除非经常性损益后的归属母公司所有者的净利润怎么算
  18. #BDA#笔记#阶段一:熟悉要分析的数据
  19. c++学习-基础-异常
  20. 文中提到的用例设计,你肯定笔试的时候肯定遇到过(朋友圈、电梯、发红包、支付)

热门文章

  1. 在 Flutter 中实现文字动画
  2. 前端基础CSS+html篇 2w字吐血总结
  3. 微信公众号推送模板消息
  4. 王左中右致出版商的信件稿
  5. 虚拟机配置固定网关及用Xshell连接虚拟机IP
  6. 使用opencv中的方法进行图像保存时,出现保存的图像全黑的问题
  7. lsdyna批处理求解工具使用
  8. 使用ansys workbench 的LSDYNA模块研究碰撞的接触设置
  9. 相似度算法余弦相似度
  10. 苏宁搭台品牌唱戏,净水市场将变天