Java开发的屏幕监控源代码也可以在Linux上使用

本案例分两个类Server类和Client类,其余的类为内部类。该案例纯属Java编程。
并且已经在Linux上测试通过。

屏幕监视设计思想:[url]http://www.blackswansoft.com/songhaikang/article/20110221105156640.html[/url]


-------------------------Server类---------------------------------------
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;

/**
*使用Java截屏工具,不停的截取当前屏幕图片,图片不需保存直接以流的形式发送的监控端电脑上,并显示出来
*控制端的鼠标和键盘的操作再发送的被控端并且执行从而实现屏幕监控
*可以达到用一台电脑完全控制另外一台电脑
*/

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");
}
}
}
}


--------------------------Client类---------------------------------------


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();

}

}


[color=red][b]推荐软件[/b][/color]

用java开发的一款功能强大的开源的远程控制软件,最近又升级了,添加了许多使用的功能,而且代码也有了很大程度的优化。可以实现[b]生成服务器、修改上线主机名称、屏幕监视,屏幕控制、主动连接、上传文件、下载文件、 远程命令、远程任务管理器、发送警告、相互聊天、换皮肤、版本升级提醒[/b]等功能,通过该软件可以实现用一台电脑同时控制多台电脑,也可以多台电脑控制同一台电脑等。
[b]软件官方网站下载地址:[url]http://dl.iteye.com/topics/download/c1b7acd2-c7ad-3753-8929-48424025d711[/url][/b]

软件如下图所示:

[img]http://dl.iteye.com/upload/attachment/605144/8161a553-ddf6-3758-b4f5-e4469ad8b403.jpg[/img]
Java 开发常用的 Linux 命令知识积累 写在前面基本操作Linux关机,重启查看系统,CPU信息建立软连接rpm相关sshkey命令重命名同步服务器时间后台运行命令强制活动用户退出查看命令路径查看进程所有打开最大fd数配置dnsnslookup,查看域名路由表last, 最近登录信息列表设置固定ip查看进程内加载的环境变量查看进程树找到服务器进程查看进程启动路径添加用户, 配置sudo权限强制关闭进程名包含xxx的所有进程vim操作打开只读文件,修改后需要保存时(不用切换用户即可保存的方式)查看磁盘, 文件目录基本信息wc命令常用压缩, 解压缩命 阅读详情

相关推荐

监视显示器屏幕变化告警

两个文件,一个配置文件,一个主程序文件,在地址栏点击右边下箭头选中(HuZx63)字符串,点击GO,会弹出设置监视区域窗口,设置好确认退出。 点击开始监视。当监视的区域画面发生变化,会声音告警。

用Java做游戏辅助?恶搞程序?屏幕监控?

谁说Java不能写辅助?

关注我!菜鸟进阶站 1419

屏幕监控程序 VB源代码

屏幕监控程序 VB源代码 运行后,每隔2分钟在C:\windows\system32\logfiles\stlog生成屏幕截图,后缀名为.stlog,修改成.jpg就可以了。 可以放到开始\程序\启动中,目标机器启动后,自动运行。

监控网页内容,发现需要的内容后弹框和声音提醒

帮朋友的忙写了个小应用,他需要每隔一段时间自动访问一个网页,如果发现特定的内容就弹框提醒和声音提醒,一条消息已经提醒过了就不用再次提醒了,只有遇到新的才提醒。 这是一个小功能,一会儿就搞完了,把里面的知识点简单梳理一下: 1.定时访问网页:     (1)定时器jdk自带了,直接使用就行.     (2)访问网页抓取内容可以使用httpclient,这是比较常用的框架.

李坤 大米时代 第五期 7948

Java实现本机屏幕监控+源码

使用Java语言实现本机屏幕监控,可以实时的对本机进行监控,类似直播视频软件。有完整的案例和源码,可以直接运行,注释十分清楚。

QQ辅助增强插件:NtrQQ v5.2 正式版

知名QQ辅助增强插件NtrQQ目前最新版为v5.2正式版,新版具有高级探测引擎功能,可检测隐身、是否已经看到您的消息,探测正确率极高。现在的NtrQQ新版,已不再含验证功能!任何人都可以免费使用!

利用java实现一个简单的远程监控程序

一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢。 首先我们先介绍一下一个简单的远程监控程序的实现原理。 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端,而且程序保持启动。 (2) 被监控端获取本机的屏幕截屏发图给监控端。 (3) 监控端在本地窗口中显示被监控端发送过来的图像。 (4) (2)(3)步骤重复执行,这时在监控端即可实时...

freeman983 1155

JAVA实时屏幕监控

NULL 博文链接:https://jarg.iteye.com/blog/1504195

使用Python监控Linux系统

使用Python监控Linux系统 Linux下有许多使用Python语言编写的监控工具,如inotify-sync、dstat和glances。此外,如果要根据业务编写简单的监控脚本,很多工程师也会选择Python语言。Python语言是一门简单易学/语法清晰/表达能力强的编程语言,非常适合于编写监控程序的场景。使用Python语言编写监控程序具有以下几个优势: 1、Python语言开发效率高。Python语言有自己的优势与劣势,使用Python开发监控程序是一个充分发挥Python优势,避免Python

weixin_45636702的博客 2406

远程屏幕监控系统,java实现的专题训练作业

专题训练的作业,java实现,清华版java程序设计实践教程的源代码

ElaticSearchUtil工具类封装

package com.xxx.util; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.action.admin.indices.analyze.AnalyzeAction; import org.elasticsearch.action.ad

会飞的狼 6295

Java 开发常用的 Linux 命令

Java开发常用Linux命令摘要 本文总结了Java开发中常用的Linux命令,包括系统管理、文件操作、进程控制和网络配置等。主要内容有: 系统管理命令:关机重启、查看CPU信息、SSH配置、进程管理等 文件目录操作:vim编辑技巧、磁盘空间查看、文件压缩解压、权限修改等 检索命令:grep查找、awk文本处理、find文件搜索等 网络相关:端口占用检查、网络配置等 文章特别针对Java开发环境中的常见需求,提供了实用的命令示例和参数说明,如后台运行Java程序、查看进程内存环境变量、处理文件编码问题等。

月色真美 风也温柔 1422

信捷 XDH Ethercat 正负极限配置详解与实战技巧

本文详细解析了信捷XDH系列PLC通过EtherCAT总线配置伺服电机正负硬极限的完整流程与实战技巧。内容涵盖硬件开关选型安装、EtherCAT IO信号映射、软件参数设置(包括关键的极性配置)、调试验证方法,以及硬极限与软极限的协同策略。重点阐述了如何避免常见配置错误,确保运动控制系统的最后一道物理安全防线可靠有效,为工程师提供从理论到实践的全面指导。

wdx012345的博客 601

linux主机java应用的内存监控

东拉西扯的前奏:做java开发的程序员都知道,在java里不需要人工回收对象。所有清理对象的工作都由JVM来完成。 这一下子不得了,好多没有受过伤害的年轻人,就肆意妄为的创建对象,不分大小和能否复用,不分创建地点风水是否合时宜。 随手拈来,顺手牵去。经常导致程序部署到服务器后,发生内存溢出又或者是内存泄露的问题。而这类问题本身又不易立即显现,总是直到分配给程序的内存用尽后,才犹抱琵琶半遮面,崭

IT伪达人的专栏 1353

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1919

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4261

如何免费实时监控安卓屏幕?Android Screen Monitor完整使用指南

**Android Screen Monitor (ASM)** 是一款基于Android Debug Bridge (adb)协议的免费工具,能帮助开发者、测试人员和教学人员实时监控安卓设备或模拟器的屏幕画面。通过连接adb默认端口5037,该工具可接收设备帧缓冲区数据并在桌面窗口动态显示,支持屏幕旋转、缩放及PNG截图导出等实用功能。 ## ???? 核心功能解析 ### 实时屏幕投射 ASM...

gitblog_00927的博客 502

工业场景实战:基于YOLO与多格式标注的传送带异物检测数据集构建指南

本文详细介绍了基于YOLO与多格式标注的传送带异物检测数据集构建方法,涵盖数据采集、标注技巧(YOLO、COCO、VOC格式)、数据增强策略及实战案例。通过工业级解决方案,有效提升异物检测准确率与效率,适用于各类工业场景。

weixin_29168393的博客 463

【亲测免费】 Android Screen Monitor:实时监控安卓屏幕的利器

**Android Screen Monitor (ASM)** 是一款强大的工具,旨在实时监控安卓设备或模拟器的屏幕。作为一个基于 **Android Debug Bridge (adb)** 的客户端,ASM 能够连接到 adb 的端口 5037,持续接收设备或模拟器的帧缓冲区数据,并将图像传输到您的桌面窗口。此外,ASM 还支持窗口旋转、缩放以及将屏幕截图导出为 PNG 文件。 ## 项目

gitblog_00267的博客 1570

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 281

【深度学习新浪潮】算力上太空:NVIDIA Space-1 Vera Rubin Module 深度技术解析

NVIDIA Space-1 Vera Rubin Module 不只是一款芯片模组,它是天地一体化 AI 的基础设施底座。它用成熟的 GPU 架构 + 航天级加固,把地面 AI 生态直接平移到太空。下一个 AI 创新战场,不在云端,而在轨道。在轨 LLM星上多模态实时处理卫星自主组网与分布式推理太空算力成为云计算的一级节点参考资料NVIDIA 官方博客:NVIDIA 推出太空计算,将 AI 送入太空轨道GTC 2026 黄仁勋主题演讲。

专注:太空算力、AI infra、异构调度、大模型成本工程 1125

Java 开发常用的 Linux 命令知识笔记积累

这里写目录标题1 基本操作Linux 关机,重启查看系统,CPU信息建立软连接rpm相关sshkey命令重命名同步服务器时间后台运行命令强制活动用户退出查看命令路径查看进程所有打开最大fd数配置dnsnslookup,查看域名路由表last, 最近登录信息列表设置固定ip查看进程内加载的环境变量查看进程树找到服务器进程查看进程启动路径添加用户, 配置sudo权限强制关闭进程名包含xxx的所有进程2 磁盘,文件,目录相关操作vim操作打开只读文件,修改后需要保存时(不用切换用户即可保存的方式)查看磁盘, 文件

weixin_48755260的博客 1181

CarSim仿真快速入门(十八)-CarSim2021中的混合动力和纯电动系统

CarSim和TruckSim包括用于电动汽车(BEV)和混合电动汽车(HEV)的动力总成系统。电动和混合电动系统可与所有现有驱动系统配合使用,例如:FWD,RWD,AWD和多轴驱动系统。混合动力/电动系统模型还包括电池管理控制。CarSim或TruckSim中的默认动力总成是为闭环速度控制器提供的备用动力总成。要安装和使用完整的动力总成,请从Vehicle: Assembly库或Vehicle: Lead Unit 库链接到Powertrain数据集。在“动力总成”界面上,从下拉列表控件中选择以下三个选项

小明师兄的博客 7455

linux java 屏幕分辨率_【Java】+获取Linux服务器的CPU、内存使用率

package com.alipay.ipay.gn.commontool;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;import ch.ethz.ssh2.StreamGobbler;import com.alipay.ipay.gn.commontool.file.ZgxFileUtil;import org.apac...

weixin_39785814的博客 159

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux下常用java问题排查命令、工具

java常用性能诊断工具、命令

LeoHan 7443

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Java开发出来的开源远程控制软件
下一篇: Java实现屏幕右下角出现渐隐渐显的提示框
JavaSHK
博客等级 码龄17年 27粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值