Как отправлять команды и получать ответы на консоль OSGi через Java Socket? - PullRequest
1 голос
/ 20 сентября 2011

Я хочу запустить OSGi Framework на другом компьютере (основным способом).Поэтому я хотел знать, есть ли способ подключиться к консоли OSGi с другого компьютера и управлять пакетами?

Я подумал, что, возможно, использование 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.как это:


- READ LOOP

-

- READ LOOP

ss

->ss


Есть какие-нибудь идеи по поводу проблемы или другого способа удаленного подключения к консоли OSGi?

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

вы используете блокировку io, поэтому ваш внутренний цикл while будет никогда завершаться, пока сокет не будет закрыт. вам нужно 2 потока, чтобы добиться этого с блокировкой потоков IO. 1 поток читает из stdin и пишет в выходной поток сокета, другой поток читает из входного потока сокета и пишет в стандартный вывод.

также вы, вероятно, захотите написать новую строку после отправки userInput на консоль osgi (Scanner.nextLine () использует новую строку).

наконец, вы вообще не хотите использовать классы Print * при работе с сокетами, поскольку они скрывают IOExceptions.

0 голосов
/ 21 сентября 2011

Вместо создания своей собственной вещи вы можете использовать один из доступных удаленных оболочек, например, Apache Felix с номером http://felix.apache.org/site/apache-felix-remote-shell.html

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...