Files
klp-oa/scaner/src/main/java/org/example/Main.java
2025-08-23 17:22:06 +08:00

144 lines
5.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package org.example;
import java.awt.AWTException;
import java.awt.Robot;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import org.json.JSONException;
import org.json.JSONObject;
public class Main {
private static String userIdentity;
// 存储扫码枪输入的字符
private static final BlockingQueue<Character> inputQueue = new ArrayBlockingQueue<>(4096);
// 扫码枪结束符回车的ASCII值
private static final int ENTER_ASCII = 13; // \r的ASCII值
private static final int NEWLINE_ASCII = 10; // \n的ASCII值
private static volatile boolean isExit = false;
public static void main(String[] args) throws InterruptedException {
System.out.print(" ***************程序开始****************** \r\n");
SCTool.lockEnglishInputMethod();
// 使用BufferedReader获取用户身份避免关闭System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入您的身份标识admin: ");
userIdentity = reader.readLine().trim();
while (userIdentity.isEmpty()) {
System.out.print("身份标识不能为空,请重新输入: ");
userIdentity = reader.readLine().trim();
}
System.out.println("已保存身份信息: " + userIdentity + "\n");
} catch (IOException e) {
System.out.println("读取用户身份时出错: " + e.getMessage());
System.exit(1);
}
// 启动输入监听和数据处理线程
startRawInputListener();
startScanDataProcessor();
System.out.println("提示1. 使用扫码枪扫描JSON数据2. 输入 'exit' 并回车退出程序\n");
// 主线程阻塞直到isExit被标记为true
while (!isExit) {
Thread.sleep(100);
}
// 程序退出清理
System.out.println("\n开始停止所有服务...");
isExit = true;
System.out.println("程序已正常退出");
}
/**
* 输入监听线程:记录所有接收的字符
*/
private static void startRawInputListener() {
Thread inputThread = new Thread(() -> {
try {
int byteData;
while (!isExit && (byteData = System.in.read()) != -1) {
char c = (char) byteData;
// 打印每个接收的字符含ASCII值用于调试
System.out.printf("[接收字符] 内容: '%c' ASCII: %d%n",
(c == '\r' ? '\\' + 'r' : c == '\n' ? '\\' + 'n' : c),
(int) c);
inputQueue.put(c);
}
} catch (IOException e) {
if (!isExit) {
System.out.println("输入监听异常: " + e.getMessage());
e.printStackTrace();
}
} catch (InterruptedException e) {
System.out.println("输入监听线程被中断");
Thread.currentThread().interrupt();
}
});
inputThread.setDaemon(true);
inputThread.start();
}
/**
* 数据处理线程:通过回车符判断扫码结束
*/
private static void startScanDataProcessor() {
Thread processorThread = new Thread(() -> {
StringBuilder inputBuffer = new StringBuilder();
try {
while (!isExit) {
// 取出队列中的字符
char c = inputQueue.take();
int ascii = (int) c;
// 判断是否为结束符(回车或换行)
if (ascii == ENTER_ASCII || ascii == NEWLINE_ASCII) {
// 缓冲区不为空时才处理(避免空输入)
if (inputBuffer.length() > 0) {
String scanInput = inputBuffer.toString().trim();
System.out.println("===== 扫码原始数据(完整) =====");
System.out.println(scanInput);
System.out.println("================================\n");
// 检查退出命令
if ("exit".equalsIgnoreCase(scanInput)) {
isExit = true;
System.out.println("\n已接收到退出指令程序将关闭...");
break;
}
// 校验JSON格式
if (SCTool.isValidJson(scanInput)) {
System.out.println("JSON格式校验通过开始处理...");
SCTool.sendDataToServer(scanInput, userIdentity);
} else {
System.out.println("错误输入不是有效JSON格式\n");
}
// 清空缓冲区,准备下一次扫码
inputBuffer.setLength(0);
}
} else {
// 非结束符则添加到缓冲区
inputBuffer.append(c);
}
}
} catch (InterruptedException e) {
System.out.println("数据处理线程被中断");
Thread.currentThread().interrupt();
}
});
processorThread.setDaemon(true);
processorThread.start();
}
}