gpt4 book ai didi

java - 如何通过 Java Socket 向 OSGi 控制台发送命令并接收响应?

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:04 24 4
gpt4 key购买 nike

我想在另一台计算机上运行 OSGi 框架(在 main 方法中)。所以我想知道是否有任何方法可以从另一台计算机连接到 OSGi 控制台并管理 bundle ?

我想也许使用java.net.Socket会有所帮助,这就是我实现它的方式。我用了2个线程。一个用于处理用户输入流,另一个用于处理 OSGi 控制台响应。这是第一个线程(处理用户输入流):

    configMap.put("osgi.console", "6666");
Framework fwk = ff.newFramework(configMap);
try {
fwk.start();
} catch (BundleException e) {
e.printStackTrace();
}

//__________________________________________________________________//

try {
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
Socket socket = new Socket(InetAddress.getByName("0.0.0.0"), 6666);
printlnInfo("Socket has been created: " + socket.getInetAddress() + ":" + socket.getPort());
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
ConsoleOutputReciever fr = new ConsoleOutputReciever();
new Thread(fr).start();
while (true) {
String userInput = "";
while ((userInput = stdIn.readLine()) != null) {
System.out.println("--> " + userInput);
out.write(userInput + "\n");
out.flush();
}
System.out.println("2");
}
} catch (Exception e1) {
e1.printStackTrace();
}

这是第二个线程(处理 OSGi 控制台响应):

public class ConsoleOutputReciever implements Runnable {

public Scanner in = null;

@Override
public void run() {
printlnInfo("ConsoleOutputReciever Started");
try {
Socket socket = new Socket(InetAddress.getByName("0.0.0.0"), 6666);
printlnInfo("Socket has been created: " + socket.getInetAddress() + ":" + socket.getPort());
String osgiResponse = "";
in = new Scanner(socket.getInputStream());
try {
while (true) {
in = new Scanner(socket.getInputStream());
while (in.hasNext()) {
System.out.println("-- READ LOOP");
osgiResponse = in.nextLine();
System.out.println("-- " + osgiResponse);
}
}
} catch (IllegalBlockingModeException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}

}
}

但我只收到 OSGi 控制台的第一个响应。像这样:

<小时/>

--读取循环

--

--读取循环

SS

--> SS

<小时/>

对这个问题有什么想法或者有其他远程连接到 OSGi 控制台的方法吗?

最佳答案

您正在使用阻塞 io,因此您的内部 while 循环将永远完成,直到套接字关闭。您需要 2 个线程来通过阻塞 io 流来完成此操作。 1 个线程从 stdin 读取并写入套接字输出流,另一个线程从套接字输入流读取并写入 stdout。

此外,您可能想在将 userInput 发送到 osgi 控制台后编写一个换行符(Scanner.nextLine() 会吃掉换行符)。

最后,在使用套接字时,您通常不想使用 Print* 类,因为它们隐藏 IOException。

关于java - 如何通过 Java Socket 向 OSGi 控制台发送命令并接收响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com