Переадресация рычагов на сервер Java - PullRequest
3 голосов
/ 31 марта 2012

У меня есть сервер Java, который использует TCP и сокеты для подключения к приложению Android (клиенту) и отправляет строки (в настоящее время полученные из объекта сканера), которые затем отображаются клиентом в виде уведомлений.

здесь код сервера без всех импортов.

открытый класс Server {

// define our Main method
public static void main(String[] args) throws IOException {
    // set up our Server Socket, set to null for the moment.
    ServerSocket serverSocket = null;
             boolean isConnected = false;

    // Lets try and instantiate our server and define a port number .
    try {
        serverSocket = new ServerSocket(6789);
                isConnected = true;
        System.out.println("***  I am the Server  ***\n");
        // make sure to always catch any exceptions that may occur.
    } catch (IOException e) {
        // always print error to "System.err"
        System.err.println("Could not listen on port: 6789.");
        System.exit(1);
    }

    // We always want to check for connection from Clients, so lets define
    // a for ever loop.
    for (;;) {
        // define a local client socket
        Socket clientSocket = null;
        // lets see if there are any connections and if so, accept it.
        try {
            clientSocket = serverSocket.accept();
            // don't forget to catch your exceptions
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        // Prepare the input & output streams via the client socket.

        // fancy way of saying we want to be able to read and write data to 
        // the client socket that is connected.

        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));
        PrintWriter outToClient = new PrintWriter(clientSocket.getOutputStream(),
                true);

              while (isConnected) { 
        // read a sentence from client
        String hiFromClient = inFromClient.readLine();


                    // Set up the logging system and timestamp and log message.

                     Calendar currentDate = Calendar.getInstance();
         SimpleDateFormat formatter= 
         new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss");
         String dateNow = formatter.format(currentDate.getTime());


        try{
            // Create file 
            File fstream = new File("log.txt");
                        FileWriter out = new FileWriter(fstream);
                               out.write(hiFromClient + " " + dateNow);

                               //Close the output stream
                               out.close();
                    } catch (Exception e){//Catch exception if any
                           System.err.println("Error: " + e.getMessage());
                    }


        // Print the client sentence to the screen
        System.out.println("The Client said: "+hiFromClient);

        // Reply to the client

                    Scanner scanner = new Scanner(System.in);
                    String sentence = scanner.nextLine();

        outToClient.println(sentence );
                    System.out.println("The Server said: " + sentence);

        }     
        // always remember to close all connections.


        inFromClient.close(); // the reader
        outToClient.close(); // the writer
        clientSocket.close(); // and the client socket
    }
}}

Growl использует порт 23053 для пересылки уведомлений.То, что я надеюсь сделать, это прослушать 23053 и отправить что-нибудь из этого в виде строки клиенту, подключенному в 6789. К сожалению, Growl привязывает номер порта, поэтому новое соединение Socket не может быть установлено.

У любого есть идеи о том, как я могу получать уведомления от номера порта, используемого рычагом, или даже просто использовать рычаг в качестве сервера для самого клиента (код клиента очень похож на серверы по тому, как он используетсяСокет вместо ServerSocket)

Любая помощь по этому вопросу будет принята с благодарностью, это разрушает мой мозг

Всего наилучшего,

Патрик.

1 Ответ

1 голос
/ 06 апреля 2012

Существует несколько способов сделать это.Если вы в отчаянии, читайте дальше:

Growl может пересылать любые уведомления, которые он получает, на другую машину под управлением Growl (настроено на вкладке Сеть).Growl использует протокол GNTP (протокол на основе TCP: http://www.growlforwindows.com/gfw/help/gntp.aspx) для пересылки сообщений. Хитрость заключается в том, что «другая машина, на которой работает Growl», не обязательно должна быть другой машиной ИЛИ работать с Growl как таковой, простоGrowl (на Mac, который, как я полагаю, вы используете) автоматически обнаружит любые другие машины в сети, на которых работает Growl (используя Bonjour и ищет имя службы _gntp._tcp), так что есливаш сервер объявляет себя поддерживающим протокол GNTP, Growl должен показать его в списке доступных назначений (Growl для Windows также позволяет вам вручную добавить имя хоста / порт для переадресации, но я не верю, что версия для Mac в настоящее время позволяет это).

Итак, вы можете настроить Growl для пересылки уведомлений на ваш сервер, используя его уже встроенные возможности. Вам потребуется реализовать код на своем сервере для получения пакетов GNTP (формат очень похож на заголовки HTTP) и разобрать их. Тогда вы могли бы переслатьe уведомления с использованием вашего текущего кода сервера.

Все еще со мной?Я действительно говорил, что это было приблизительно, но это не только технически возможно, но я и раньше создавал демона, имитирующего Growl, чтобы можно было отправлять уведомления из Growl в мой пользовательский код.Не предлагая это как лучшую идею, но просто альтернативу, так как вы спросили.

...