Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java套接字向OSGi控制台发送命令和接收响应?_Java_Sockets_Osgi - Fatal编程技术网

如何通过Java套接字向OSGi控制台发送命令和接收响应?

如何通过Java套接字向OSGi控制台发送命令和接收响应?,java,sockets,osgi,Java,Sockets,Osgi,我想在另一台计算机上运行OSGi框架(在主方法中)。所以我想知道有没有办法从另一台计算机连接到OSGi控制台并管理捆绑包 我想也许使用java.net.Socket会有所帮助,我就是这样实现的。我用了两条线。一个用于处理用户输入流,另一个用于处理OSGi控制台响应。这是第一个线程(处理用户输入流): 这是第二个线程(处理OSGi控制台响应): 但我只收到OSGi控制台的第一个响应。像这样: --读循环 -- --读循环 党卫军 -->党卫军 有没有关于这个问题的想法或者远程连接到OSGi控制

我想在另一台计算机上运行OSGi框架(在主方法中)。所以我想知道有没有办法从另一台计算机连接到OSGi控制台并管理捆绑包

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

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

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


--读循环

--

--读循环

党卫军

-->党卫军



有没有关于这个问题的想法或者远程连接到OSGi控制台的其他方法?

您正在使用阻塞io,因此您的内部while循环在套接字关闭之前永远不会结束。通过阻塞io流,您需要2个线程来完成此任务。1个线程从stdin读取并写入套接字输出流,另一个线程从套接字输入流读取并写入stdout

另外,您可能希望在将userInput发送到osgi控制台后编写一个新行(Scanner.nextLine()读取新行)


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

您使用的是阻塞io,因此在关闭套接字之前,内部while循环永远不会完成。通过阻塞io流,您需要2个线程来完成此任务。1个线程从stdin读取并写入套接字输出流,另一个线程从套接字输入流读取并写入stdout

另外,您可能希望在将userInput发送到osgi控制台后编写一个新行(Scanner.nextLine()读取新行)


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

您可能希望使用一个可用的远程shell,而不是构建自己的东西,例如,ApacheFelixOne位于

而不是构建您自己的东西,您可能希望使用一个可用的远程shell,例如ApacheFelixOne位于

这就是为什么我使用了
socket.setSortimeout(tms)。内部while循环结束(您可以看到它在输出中打印“1”),但我不理解为什么控制台不再发送任何响应。在此之前,我也尝试过多线程,但没有任何区别(输出是相同的)。我发送命令的方式有什么问题吗?@Hesam-设置套接字超时不是你想要的解决方案,相信我(阅读任何有关阻止io的教程,你会发现你需要在单独的线程上处理输入/输出)。请尝试执行我的建议,然后看看这会给你带来什么。@Hesam-是的,你会得到1,之后你的扫描仪可能就没用了。一旦你得到了一个流的“结尾”,你就不会从中获得更多的数据了。你是对的,扫描器在那之后就没用了。但是现在我正在测试2线程解决方案,它没有任何区别。似乎
nextLine()
正在以任何方式阻塞。我把里面的线放在一个单独的线里。我真的对这个问题感到困惑。我什么都试过了,似乎什么都没用!知道怎么回事吗?@Hesam-你走对了。但是,您不需要2个套接字连接,而是希望与另一个线程共享您创建的第一个套接字连接。内部while循环结束(您可以看到它在输出中打印“1”),但我不理解为什么控制台不再发送任何响应。在此之前,我也尝试过多线程,但没有任何区别(输出是相同的)。我发送命令的方式有什么问题吗?@Hesam-设置套接字超时不是你想要的解决方案,相信我(阅读任何有关阻止io的教程,你会发现你需要在单独的线程上处理输入/输出)。请尝试执行我的建议,然后看看这会给你带来什么。@Hesam-是的,你会得到1,之后你的扫描仪可能就没用了。一旦你得到了一个流的“结尾”,你就不会从中获得更多的数据了。你是对的,扫描器在那之后就没用了。但是现在我正在测试2线程解决方案,它没有任何区别。似乎
nextLine()
正在以任何方式阻塞。我把里面的线放在一个单独的线里。我真的对这个问题感到困惑。我什么都试过了,似乎什么都没用!知道怎么回事吗?@Hesam-你走对了。但是,您不需要2个套接字连接,而是希望与另一个线程共享您创建的第一个套接字连接。equinox有类似的吗?equinox有类似的吗?
    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();
    }
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();
    }

   }
}