我有一个Java程序,可以通过网络发送一些数据。我还将捕获在客户端上按下的所有键,并将它们发送到服务器,因此服务器维护一个缓冲区,其中包含在客户端上按下的所有键。
我需要创建一个包含客户端生成的最终文本的文件。以以下顺序为例:
press j
press h
press BACKSPACE
press H
press e
press l
press HOME
press DEL
press END
press l
press o
处理此序列会产生:
Hello
这是一个简单的示例,但请注意,它也可以包含箭头键。
处理此缓冲区可能容易出错且耗时。如果有人可以介绍一个库来执行这些操作或显示一种简单的执行方法,我将不胜感激。
编辑: 我将问题改为询问特定问题,而不是寻找图书馆。
我不想创建控制台解析器,也不需要历史记录或制表符完成。因此,我的问题与Java中类似readline的库不同。
谢谢。
答案 0 :(得分:1)
听起来像您正在构建按键记录器。我想这就是为什么两个人已对您投反对票的原因。有趣的是,我目前正在撰写有关此类材料的硕士学位论文:P https://github.com/kamiljano/CloudDoorThesis 我的POC不会进行任何密钥记录,而只是允许您从远程设备远程下载文件。
无论如何,从您的输入来看,您正在通过TCP套接字与服务器进行通信。别!防火墙永远不会让您通过。坚持使用更常见的东西,例如HTTP。然后,您可以拥有一个像http://server.com/keys这样的端点,并像这样向其发送JSON请求
{
"strokes": [
"a", "b", "c", "backspace"
]
}
不要在用户每次按下按钮->时上传您的东西,这会给网络带来很大压力。因此,您将每20个击键或每1分钟生成一个HTTP PUT请求。确保该请求是由按键记录器在单独的线程中完成的,否则用户将注意到该字符在屏幕上显示需要0.5-2秒的时间。不要将密钥存储在应用程序的内存中-> 10位用户在Facebook上撰写新帖子后,您的内存将用完。而是将所有更改存储在数据库中。此时,您首先要编写一小段代码,例如
String result = "";
for (String key : strokes) {
if ("backspace".equals(key) && result.size() > 0) {
result = result.substring(0, result.size() - 2);
} else if ("del".equals(key) && result.size() > 0) {
result = result.subscring(1, result.size() - 1);
} else {
result += key;
}
}
updateDatabaseEntry(userId, result);
答案 1 :(得分:1)
因此,没有要执行的操作的库。我建议实现自己的类,该类收集所有更改并一次敲击一个键来构建一个字符串。 作为您的入门者,我编写了以下课程(尽管显然需要使用您希望能够处理的其他键的逻辑进行扩展)
public class KeyBuffer {
private static final String SIMPLE_CHARACTERS = "abcdefghijklmopqrstuvqxyz;?!#$%^&&*()_+";//TODO: extend with all characters that the users can enter
private String buffer = "";
private int position = 0;
private String[] splitAtCurrentPosition() {
return new String[]{
buffer.substring(0, position),
buffer.substring(position, buffer.length() == position ? position : buffer.length())
};
}
private void addCharacter(String character) {
String[] parts = splitAtCurrentPosition();
buffer = parts[0].substring(0, parts[0].length()) + character + parts[1];
position++;
}
public void add(String key) {
if (SIMPLE_CHARACTERS.contains(key)) {
addCharacter(key);
return;
}
if ("backspace".equals(key) && buffer.length() > 0) {
String[] parts = splitAtCurrentPosition();
buffer = parts[0].substring(0, parts[0].length() - 1) + parts[1];
position --;
} else if ("arrow_left".equals(key)) {
if (position > 0) {
position --;
}
} else {
throw new UnsupportedOperationException("The key " + key + " is not supported");
}
//TODO: add logic for all remaining special keys
}
@Override
public String toString() {
return buffer;
}
}
使用以下junit测试进行了快速测试:
public class KeyBufferTest {
@Test
public void addSimpleCharacter() {
KeyBuffer buffer = new KeyBuffer();
buffer.add("a");
buffer.add("b");
buffer.add("c");
assertEquals("abc", buffer.toString());
}
@Test
public void addUsingArrows() {
KeyBuffer buffer = new KeyBuffer();
buffer.add("a");
buffer.add("b");
buffer.add("arrow_left");
buffer.add("c");
assertEquals("acb", buffer.toString());
}
@Test
public void addBackspace() {
KeyBuffer buffer = new KeyBuffer();
buffer.add("a");
buffer.add("b");
buffer.add("arrow_left");
buffer.add("backspace");
buffer.add("c");
assertEquals("cb", buffer.toString());
}
}