package cn.org.hentai.client.client;
import cn.org.hentai.client.worker.*;
import cn.org.hentai.tentacle.encrypt.MD5;
import cn.org.hentai.tentacle.hid.HIDCommand;
import cn.org.hentai.tentacle.hid.KeyboardCommand;
import cn.org.hentai.tentacle.hid.MouseCommand;
import cn.org.hentai.tentacle.protocol.Command;
import cn.org.hentai.tentacle.protocol.Packet;
import cn.org.hentai.tentacle.system.FileSystem;
import cn.org.hentai.tentacle.util.ByteUtils;
import cn.org.hentai.tentacle.util.Configs;
import cn.org.hentai.tentacle.util.Log;
import cn.org.hentai.tentacle.util.Nonce;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.io.*;
import java.net.Socket;
/**
* Created by matrixy on 2018/4/15.
*/
public class Client extends Thread
{
// 是否正在发送截图
boolean working = false;
boolean authenticated = false;
BaseWorker captureWorker;
BaseWorker compressWorker;
HIDCommandExecutor hidCommandExecutor;
Socket conn;
InputStream inputStream;
OutputStream outputStream;
long lastActiveTime = 0L;
// 与服务器间的会话处理
private void converse() throws Exception
{
working = false;
conn = new Socket(Configs.get("server.addr"), Configs.getInt("server.port", 1986));
conn.setSoTimeout(30000);
conn.setKeepAlive(true);
inputStream = conn.getInputStream();
outputStream = conn.getOutputStream();
lastActiveTime = System.currentTimeMillis();
Log.info("Connected to server...");
// 1. 身份验证
String clientName = Configs.get("client.name", "unknown");
byte clientNameBytes[] = clientName.getBytes("UTF-8");
if (clientName.length() > 20) throw new RuntimeException("受控端名称不能超过20个字符");
Packet packet = Packet.create(Command.AUTHENTICATE, 64 + clientNameBytes.length + 4);
packet.addInt(clientNameBytes.length);
packet.addBytes(clientNameBytes);
String nonce = Nonce.generate(32);
packet.addBytes(nonce.getBytes());
packet.addBytes(MD5.encode(nonce + ":::" + Configs.get("client.key")).getBytes());
send(packet);
while (true)
{
if (System.currentTimeMillis() - lastActiveTime > 30000) break;
// 有无下发下来的数据包
packet = Packet.read(inputStream);
if (packet != null)
{
lastActiveTime = System.currentTimeMillis();
processCommand(packet);
continue;
}
// 处理服务器下发的指令
// 有无需要上报的截图
if (ScreenImages.hasCompressedScreens())
{
lastActiveTime = System.currentTimeMillis();
sendScreenImages();
continue;
}
// 如果闲置超过20秒,则发送一个心跳包
if (System.currentTimeMillis() - lastActiveTime > 3000)
{
Packet p = Packet.create(Command.HEARTBEAT, 5);
p.addBytes("HELLO".getBytes());
send(p);
lastActiveTime = System.currentTimeMillis();
}
sleep(5);
}
Log.info("Connection closed...");
}
// 处理服务器端下发的指令
private void processCommand(Packet packet) throws Exception
{
packet.skip(6);
int cmd = packet.nextByte();
int length = packet.nextInt();
Packet resp = null;
if (cmd != Command.AUTHENTICATE_RESPONSE && authenticated == false) return;
if (cmd == Command.AUTHENTICATE_RESPONSE)
{
if (packet.nextByte() == 0x00) authenticated = true;
else
{
Log.info("会话认证失败");
System.exit(1);
}
}
// 心跳
else if (cmd == Command.HEARTBEAT)
{
// ..
}
// 开始远程控制
else if (cmd == Command.CONTROL_REQUEST)
{
if (working) throw new RuntimeException("Already working on capture screenshots...");
working = true;
// TODO: 暂不响应服务器端的控制请求的细节要求,比如压缩方式、带宽、颜色位数等
int compressMethod = packet.nextByte() & 0xff;
int bandWidth = packet.nextByte() & 0xff;
int colorBits = packet.nextByte() & 0xff;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
resp = Packet.create(Command.CONTROL_RESPONSE, 15)
.addByte((byte)0x01) // 压缩方式
.addByte((byte)0x00) // 带宽
.addByte((byte)0x03) // 颜色位数
.addShort((short)screenSize.getWidth()) // 屏幕宽度
.addShort((short)screenSize.getHeight()) // 屏幕高度
.addLong(System.currentTimeMillis()); // 当前系统时间戳
(captureWorker = new CaptureWorker()).start();
(compressWorker = new CompressWorker()).start();
(hidCommandExecutor = new HIDCommandExecutor()).start();
}
// 获取剪切板内容
else if (cmd == Command.GET_CLIPBOARD)
{
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable content = clipboard.getContents(null);
if (content.isDataFlavorSupported(DataFlavor.stringFlavor))
{
String text = (String)clipboard.getData(DataFlavor.stringFlavor);
// 剪切板没有内容就别回应了
if (text != null && text.length() > 0)
{
byte[] bytes = text.getBytes("UTF-8");
resp = Packet.create(Command.GET_CLIPBOARD_RESPONSE, 4 + bytes.length).addInt(bytes.length).addBytes(bytes);
}
}
}
// 设置剪切板内容
else if (cmd == Command.SET_CLIPBOARD)
{
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
int len = packet.nextInt();
String text = new String(packet.nextBytes(len), "UTF-8");
StringSelection selection = new StringSelection(text);
clipboard.setContents(selection, null);
resp = Packet.create(Command.SET_CLIPBOARD_RESPONSE, 4).addBytes("OJBK".getBytes());
}
// 键鼠事件处理
else if (cmd == Command.HID_COMMAND)
{
int hidType = packet.nextByte() & 0xff;
int eventType = packet.nextByte() & 0xff;
int key = packet.nextByte() & 0xff;
short x = packet.nextShort();
short y = packet.nextShort();
int timestamp = packet.nextInt() & 0xffffffff;
HIDCommand hidCommand = null;
if (hidType == HIDCommand.TYPE_MOUSE)
{
hidCommand = new MouseCommand(eventType, key, x, y, timestamp);
}
else
{
hidCommand = new KeyboardCommand(key, eventType, timestamp);
}
hidCommandExecutor.add(hidCommand);
}
// 停止远程控制
else if (cmd == Command.CLOSE_REQUEST)
{
resp = Packet.create(Command.CLOSE_RESPONSE, 4).addBytes("OJBK".getBytes());
working = false;
captureWorker.terminate();
compressWorker.terminate();
hidCommandExecutor.terminate();
ScreenImages.clear();
}
// 列出文件列表
else if (cmd == Command.LIST_FILES)
{
int len = packet
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java AWT、SpringBoot、websocket、canvas的跨平台远程桌面实现
共315个文件
java:99个
js:56个
png:42个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 123 浏览量
2023-05-25
10:48:03
上传
评论
收藏 3.01MB ZIP 举报
温馨提示
基于Java AWT、SpringBoot、websocket、canvas的跨平台远程桌面实现,目前支持远程桌面控制,剪切板共享、文件传输等。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java AWT、SpringBoot、websocket、canvas的跨平台远程桌面实现 (315个子文件)
test1.bmp 977KB
bootstrap.min.css 98KB
glyphicons.css 57KB
style.min.css 57KB
add-ons.min.css 53KB
jquery-ui-1.10.4.min.css 27KB
halflings.css 25KB
bootstrap-editable.css 21KB
font-awesome.min.css 20KB
filetypes.css 15KB
tentacle.css 13KB
fullcalendar.css 11KB
dropzone.css 11KB
jquery.mmenu.css 8KB
social.css 7KB
climacons-font.css 6KB
xcharts.min.css 4KB
tentacle.css 3KB
jquery-jvectormap-1.2.2.css 744B
morris.css 443B
Thumbs.db 76KB
Thumbs.db 51KB
Thumbs.db 26KB
Thumbs.db 20KB
fontawesome-webfont.eot 71KB
glyphicons-halflings-regular.eot 20KB
climacons-webfont.eot 18KB
footer.ftl 14KB
index.ftl 12KB
login.ftl 5KB
resource.ftl 2KB
sample.ftl 1KB
header.ftl 910B
siderbar.ftl 543B
main.ftl 0B
loading.gif 5KB
.gitignore 101B
filemanager.html 11KB
keyboard.html 9KB
index.html 2KB
xmind.ico 361KB
md.ico 361KB
pdf.ico 281KB
msword.ico 164KB
visio.ico 162KB
msppt.ico 161KB
msxls.ico 161KB
access.ico 161KB
msproject.ico 160KB
mspub.ico 160KB
pictures.ico 82KB
exe.ico 56KB
config.ico 54KB
video.ico 53KB
zip.ico 53KB
folder.ico 52KB
audio.ico 50KB
font.ico 47KB
shell32_255.ico 47KB
vspro.ico 46KB
unknown.ico 45KB
winexe.ico 45KB
txt.ico 37KB
bt.ico 31KB
java.ico 29KB
rp.ico 29KB
html.ico 25KB
py.ico 19KB
mail.ico 17KB
xml.ico 14KB
cert.ico 10KB
image.ico 10KB
sql.ico 9KB
favicon.ico 1KB
chm.ico 1KB
script.ico 1KB
Client.java 12KB
TentacleDesktopWSS.java 10KB
QuerySQL.java 9KB
TentacleDesktopSession.java 9KB
RLEncoding.java 7KB
Http.java 7KB
Packet.java 6KB
CompressTest.java 6KB
UpdateSQL.java 6KB
DBAccess.java 5KB
Block.java 5KB
InsertSQL.java 4KB
ByteUtils.java 4KB
HIDCommandExecutor.java 4KB
VLinkedList.java 4KB
MainController.java 4KB
CompressWorker.java 3KB
FileDownloadController.java 3KB
KeyMapping.java 3KB
Capture.java 2KB
TentacleDesktopSessionHandler.java 2KB
ByteHolder.java 2KB
DbUtil.java 2KB
Decompress.java 2KB
共 315 条
- 1
- 2
- 3
- 4
资源评论
- dengjtao2024-04-11这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功