网络远程桌面连接
程序员文章站
2022-06-01 11:51:41
...
网络人远程控制软件是一款专业的远程桌面连接软件,专门针对企事业机关单位进行远程桌面连接设计。安装只需几秒、操作简单方便。完美的界面设计、强大的监控功能、稳定的系统平台,满足了客户实现远程桌面连接的需求。为用户远程办公、监控、远程协助提供了方便。
网络人远程桌面连接在很大程度上让客户领略了前所未有的监控感。网络人是国内远程桌面连接的领先人物,是国内唯一一位获得国家*部产品安全监测报告的,继而奠定了在行业的地位。网络人相继开发出满足不同客户需求的远程桌面连接软件,产品多样化填补了远程控制软件行业的缺陷。
远程桌面连接可以操作被控端电脑收发邮件、查看报表、进行用户管理、系统维护更新、安装卸载软件等等, 就像直接在这台电脑操作一样方便。网络人远程控制企业版是一款使用UDP协议的内网穿透技术,可以穿透防火墙,不用做端口映射,不会被杀毒软件当作病毒来查杀,安全可靠。可实现的功能有:遥控鼠标键盘,进行远程桌面连接,批量分发文件,批量开机、关机,发送文字广播,远程开启摄像头形成视频墙,还能进行监控录像,以备定时查看,还有语音文字聊天功能,管理远程电脑进程和窗口,键盘记录读取,无需逐一输入IP/ID和控制密码被控电脑即可自动上线。网络人还可以选择U盾加密技术实现U盾加密保护,即使网络人控制软件账号密码不幸被盗,仍能确保公司安全不外泄,将企业信息安全提升到网络电子银行的安全标准,这样能让电脑监控功能的安全级别更加提高,就满足那些要求电脑桌面监控安全级别要求非常高的用户。
网络人远程桌面连接软件可实现用户对远程控制连接被控电脑桌面的需求,特别适用于其他方式的远程桌面连接不上时候,只需要登录到网络人官方网站下载,在双方电脑安装上网络人远程监控软件远程桌面连接软件,只需要双方电脑能上网,即可进行连接。这就有效解决了远程桌面连接不上问题。桌面连不上有可能是两个原因,开着防火墙、某个软件占用了某个网络端口,基于以上两点分析,网络人远程桌面连接软件可以提供另一种方式的远程桌面连接。
package cjl.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 远程控制服务端
*
* @author kowloon
*
*/
public class MyServer {
public static void main(String[] args) throws IOException {
new MyServer().initServer();
}
// 初始化服务端的方法
public void initServer() throws IOException {
// 创建服务端套接字对象
ServerSocket server = new ServerSocket(10010);
System.out.println("服务器已经启动,等待连接");
// 等待客户端连接,如果有客户端连接上,会收到客户端套接字
Socket socket = server.accept();
System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());
// 启动一个线程来给客户端发送服务端桌面
SendThread st = new SendThread(socket);
st.start();
//启动一个线程来接收客户端发来的控制消息
RecieveThread rt = new RecieveThread(socket);
rt.start();
}
}
package cjl.server;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
/**
* 服务端用来接收客户端消息的线程
*
* @author kowloon
*
*/
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 (btnNum == MouseEvent.BUTTON2) {
btnMask = InputEvent.BUTTON2_MASK;
} else if (btnNum == MouseEvent.BUTTON3) {
btnMask = InputEvent.BUTTON3_MASK;
}
if ("pressed".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mousePress(btnMask);// 按下对应的鼠标按键
} else if ("released".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
} else if ("moved".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cjl.server;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.ImageIcon;
/**
* 发送数据的线程
*
* @author kowloon
*
*/
public class SendThread extends Thread {
Socket socket;
public SendThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
//从套接字上获得输出流
OutputStream ops = socket.getOutputStream();
//包装成对象流
ObjectOutputStream oos = new ObjectOutputStream(ops);
// 创建一个机器人对象,用来截屏
Robot robot = new Robot();
while (true) {
// 获得屏幕的分辨率
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dim = tool.getScreenSize();
// 要截取的起始点
Point p = new Point(0, 0);
// 指定截取的区域
Rectangle rect = new Rectangle(p, dim);
// 开始截屏,获得截取到的图像
BufferedImage img = robot.createScreenCapture(rect);
//由于BufferedImage没有实现序列化,不能写到IO中
//将BufferedImage包装成可写入IO的图像对象
ImageIcon icon = new ImageIcon(img);
//写出对象
oos.writeObject(icon);
oos.flush();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
package 远程控制客户端;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
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 kowloon
*
*/
public class ClientUI extends JFrame {
ObjectOutputStream oos;
public static void main(String[] args) {
new ClientUI().initUI();
}
private JTextField ipField;
private JTextField portField;
private JPanel panel;
/**
* 初始化客户端界面的方法
*/
public void initUI() {
this.setTitle("远程控制");
this.setSize(800, 600);
this.setResizable(false);
this.setDefaultCloseOperation(3);
// this.setLayout(new BorderLayout());
// 用来显示远程桌面的面板
panel = new JPanel();
JScrollPane jsp = new JScrollPane(panel);
jsp.setPreferredSize(new Dimension(600, 400));
jsp.setAutoscrolls(true);
this.add(jsp, BorderLayout.CENTER);
JPanel tool = new JPanel();
tool.setPreferredSize(new Dimension(600, 50));
this.add(tool, BorderLayout.SOUTH);
JLabel ipLabel = new JLabel("IP:");
ipField = new JTextField("127.0.0.1", 10);
JLabel portLabel = new JLabel("PORT:");
portField = new JTextField("10010",;
JButton btn = new JButton("连接服务器");
tool.add(ipLabel);
tool.add(ipField);
tool.add(portLabel);
tool.add(portField);
tool.add(btn);
this.setVisible(true);
// 给按钮添加监听器
MyListener mlis = new MyListener();
btn.addActionListener(mlis);
// 给面板添加监听器
MyMouseListener mmlis = new MyMouseListener();
panel.addMouseListener(mmlis);
panel.addMouseMotionListener(mmlis);
}
// panel的鼠标监听器
class MyMouseListener implements MouseListener, MouseMotionListener {
@Override
public void mousePressed(MouseEvent e) {
// 得到鼠标的位置
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "pressed";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "released";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "moved";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
}
// 按钮监听器
class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 获得Ip@端口
String ip = ipField.getText();
String port = portField.getText();
int intPort = Integer.parseInt(port);
try {
// 创建客户端套接字,连接服务端
Socket socket = new Socket(ip, intPort);
OutputStream ops = socket.getOutputStream();
// 需要发送int,String,要包装成对象流
oos = new ObjectOutputStream(ops);
// 不停的接受服务端发来的图片
RecieveThread rt = new RecieveThread(socket, panel);
rt.start();
} catch (Exception e1) {
// 弹出错误提示框
JOptionPane.showMessageDialog(null, "网络异常,无法连接服务器!");
e1.printStackTrace();
}
}
}
}
package 远程控制客户端;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
/**
* 客户端接收服务端桌面的线程
*
* @author kowloon
*
*/
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 {
// 从Socket上获得输入流
InputStream ips = socket.getInputStream();
// 由于接受的是对象流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
Object obj = ois.readObject();
ImageIcon icon = (ImageIcon) obj;
//获得图像大小(即为服务端桌面大小)
int width = icon.getIconWidth();
int height = icon.getIconHeight();
System.out.println(width+"<>"+height);
//修改panel大小为服务端桌面大小
panel.setPreferredSize(new Dimension(width,height));
//获得画布
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0,0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
网络人远程桌面连接在很大程度上让客户领略了前所未有的监控感。网络人是国内远程桌面连接的领先人物,是国内唯一一位获得国家*部产品安全监测报告的,继而奠定了在行业的地位。网络人相继开发出满足不同客户需求的远程桌面连接软件,产品多样化填补了远程控制软件行业的缺陷。
远程桌面连接可以操作被控端电脑收发邮件、查看报表、进行用户管理、系统维护更新、安装卸载软件等等, 就像直接在这台电脑操作一样方便。网络人远程控制企业版是一款使用UDP协议的内网穿透技术,可以穿透防火墙,不用做端口映射,不会被杀毒软件当作病毒来查杀,安全可靠。可实现的功能有:遥控鼠标键盘,进行远程桌面连接,批量分发文件,批量开机、关机,发送文字广播,远程开启摄像头形成视频墙,还能进行监控录像,以备定时查看,还有语音文字聊天功能,管理远程电脑进程和窗口,键盘记录读取,无需逐一输入IP/ID和控制密码被控电脑即可自动上线。网络人还可以选择U盾加密技术实现U盾加密保护,即使网络人控制软件账号密码不幸被盗,仍能确保公司安全不外泄,将企业信息安全提升到网络电子银行的安全标准,这样能让电脑监控功能的安全级别更加提高,就满足那些要求电脑桌面监控安全级别要求非常高的用户。
网络人远程桌面连接软件可实现用户对远程控制连接被控电脑桌面的需求,特别适用于其他方式的远程桌面连接不上时候,只需要登录到网络人官方网站下载,在双方电脑安装上网络人远程监控软件远程桌面连接软件,只需要双方电脑能上网,即可进行连接。这就有效解决了远程桌面连接不上问题。桌面连不上有可能是两个原因,开着防火墙、某个软件占用了某个网络端口,基于以上两点分析,网络人远程桌面连接软件可以提供另一种方式的远程桌面连接。
package cjl.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 远程控制服务端
*
* @author kowloon
*
*/
public class MyServer {
public static void main(String[] args) throws IOException {
new MyServer().initServer();
}
// 初始化服务端的方法
public void initServer() throws IOException {
// 创建服务端套接字对象
ServerSocket server = new ServerSocket(10010);
System.out.println("服务器已经启动,等待连接");
// 等待客户端连接,如果有客户端连接上,会收到客户端套接字
Socket socket = server.accept();
System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());
// 启动一个线程来给客户端发送服务端桌面
SendThread st = new SendThread(socket);
st.start();
//启动一个线程来接收客户端发来的控制消息
RecieveThread rt = new RecieveThread(socket);
rt.start();
}
}
package cjl.server;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
/**
* 服务端用来接收客户端消息的线程
*
* @author kowloon
*
*/
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 (btnNum == MouseEvent.BUTTON2) {
btnMask = InputEvent.BUTTON2_MASK;
} else if (btnNum == MouseEvent.BUTTON3) {
btnMask = InputEvent.BUTTON3_MASK;
}
if ("pressed".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mousePress(btnMask);// 按下对应的鼠标按键
} else if ("released".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
} else if ("moved".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cjl.server;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.ImageIcon;
/**
* 发送数据的线程
*
* @author kowloon
*
*/
public class SendThread extends Thread {
Socket socket;
public SendThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
//从套接字上获得输出流
OutputStream ops = socket.getOutputStream();
//包装成对象流
ObjectOutputStream oos = new ObjectOutputStream(ops);
// 创建一个机器人对象,用来截屏
Robot robot = new Robot();
while (true) {
// 获得屏幕的分辨率
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dim = tool.getScreenSize();
// 要截取的起始点
Point p = new Point(0, 0);
// 指定截取的区域
Rectangle rect = new Rectangle(p, dim);
// 开始截屏,获得截取到的图像
BufferedImage img = robot.createScreenCapture(rect);
//由于BufferedImage没有实现序列化,不能写到IO中
//将BufferedImage包装成可写入IO的图像对象
ImageIcon icon = new ImageIcon(img);
//写出对象
oos.writeObject(icon);
oos.flush();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
package 远程控制客户端;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
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 kowloon
*
*/
public class ClientUI extends JFrame {
ObjectOutputStream oos;
public static void main(String[] args) {
new ClientUI().initUI();
}
private JTextField ipField;
private JTextField portField;
private JPanel panel;
/**
* 初始化客户端界面的方法
*/
public void initUI() {
this.setTitle("远程控制");
this.setSize(800, 600);
this.setResizable(false);
this.setDefaultCloseOperation(3);
// this.setLayout(new BorderLayout());
// 用来显示远程桌面的面板
panel = new JPanel();
JScrollPane jsp = new JScrollPane(panel);
jsp.setPreferredSize(new Dimension(600, 400));
jsp.setAutoscrolls(true);
this.add(jsp, BorderLayout.CENTER);
JPanel tool = new JPanel();
tool.setPreferredSize(new Dimension(600, 50));
this.add(tool, BorderLayout.SOUTH);
JLabel ipLabel = new JLabel("IP:");
ipField = new JTextField("127.0.0.1", 10);
JLabel portLabel = new JLabel("PORT:");
portField = new JTextField("10010",;
JButton btn = new JButton("连接服务器");
tool.add(ipLabel);
tool.add(ipField);
tool.add(portLabel);
tool.add(portField);
tool.add(btn);
this.setVisible(true);
// 给按钮添加监听器
MyListener mlis = new MyListener();
btn.addActionListener(mlis);
// 给面板添加监听器
MyMouseListener mmlis = new MyMouseListener();
panel.addMouseListener(mmlis);
panel.addMouseMotionListener(mmlis);
}
// panel的鼠标监听器
class MyMouseListener implements MouseListener, MouseMotionListener {
@Override
public void mousePressed(MouseEvent e) {
// 得到鼠标的位置
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "pressed";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "released";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "moved";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
}
// 按钮监听器
class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 获得Ip@端口
String ip = ipField.getText();
String port = portField.getText();
int intPort = Integer.parseInt(port);
try {
// 创建客户端套接字,连接服务端
Socket socket = new Socket(ip, intPort);
OutputStream ops = socket.getOutputStream();
// 需要发送int,String,要包装成对象流
oos = new ObjectOutputStream(ops);
// 不停的接受服务端发来的图片
RecieveThread rt = new RecieveThread(socket, panel);
rt.start();
} catch (Exception e1) {
// 弹出错误提示框
JOptionPane.showMessageDialog(null, "网络异常,无法连接服务器!");
e1.printStackTrace();
}
}
}
}
package 远程控制客户端;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
/**
* 客户端接收服务端桌面的线程
*
* @author kowloon
*
*/
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 {
// 从Socket上获得输入流
InputStream ips = socket.getInputStream();
// 由于接受的是对象流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
Object obj = ois.readObject();
ImageIcon icon = (ImageIcon) obj;
//获得图像大小(即为服务端桌面大小)
int width = icon.getIconWidth();
int height = icon.getIconHeight();
System.out.println(width+"<>"+height);
//修改panel大小为服务端桌面大小
panel.setPreferredSize(new Dimension(width,height));
//获得画布
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0,0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
上一篇: 模板总结
下一篇: idea 头注释模板