2012-03-30 4 views
3

Ich habe einen Java-Server, der TCP und Sockets verwendet, um eine Verbindung zu einer Android-Anwendung (dem Client) herzustellen und Strings (derzeit aus einem Scanner-Objekt) gesendet, die dann als Benachrichtigungen vom Client angezeigt werden .Growl Weiterleitung an Java-Server

Servercode ohne alle Importe.

public class 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 verwendet Port 23053 für die Benachrichtigung Weiterleitung. Was ich zu tun hoffe, ist, auf 23053 zu hören und alles als String an den bei 6789 angeschlossenen Client zu senden. Bedauerlicherweise bindet Growl die Portnummer, so dass keine neue Socket-Verbindung hergestellt werden kann.

Irgendwelche Ideen, wie ich Benachrichtigungen von der Portnummer erhalten könnte, die growl verwendet, oder einfach knurl als Server für den Client selbst verwenden (der Code des Clients ist übrigens den Sockeln sehr ähnlich, nur mit Socket) seine Zerstörung Jede Hilfe wäre auf diese sehr geschätzt

von ServerSocket-), mein Gehirn

Alles Gute,

Patrick.

Antwort

1

Es gibt eine Runde über Sie könnten es tun. Wenn Sie verzweifelt sind, lesen Sie weiter:

Growl kann alle empfangenen Benachrichtigungen an einen anderen Computer weiterleiten, auf dem Growl läuft (konfiguriert auf der Registerkarte Netzwerk). Growl verwendet das GNTP-Protokoll (ein TCP-basiertes Protokoll: http://www.growlforwindows.com/gfw/help/gntp.aspx), um die Nachrichten weiterzuleiten. Der Trick ist, dass "andere Maschine, die Growl ausführt", nicht wirklich eine andere Maschine sein muss oder dass Growl per se läuft, es muss nur so angezeigt werden, dass es Growl ist. Growl (auf dem Mac, von dem ich annehme, dass Sie es verwenden) erkennt automatisch alle anderen Maschinen im Netzwerk, auf denen Growl läuft (mit Bonjour und nach dem Dienstnamen _gntp._tcp), wenn Ihr Server sich selbst als GNTP-unterstützend ankündigt Protokoll sollte Growl es in der Liste der verfügbaren Ziele anzeigen. (Growl für Windows lässt Sie auch manuell einen Hostnamen/Port hinzufügen, an den weitergeleitet werden soll, aber ich glaube nicht, dass die Mac-Version das derzeit zulässt).

Dann könnten Sie Growl so konfigurieren, dass Benachrichtigungen mit den bereits integrierten Funktionen an Ihren Server weitergeleitet werden. Sie müssten Code in Ihrem Server implementieren, um die GNTP-Pakete zu empfangen (das Format ist den HTTP-Headern sehr ähnlich), und analysieren sie. Dann könnten Sie die Benachrichtigungen mit Ihrem aktuellen Servercode weiterleiten.

Immer noch mit mir? Ich habe gesagt, dass es rundherum war, aber es ist nicht nur technisch möglich, aber ich habe einen Growl-imitierenden Daemon erstellt, sodass ich Benachrichtigungen von Growl an meinen benutzerdefinierten Code weiterleiten konnte. Nicht als die beste Idee vorschlagen, aber nur eine Alternative, seit Sie gefragt haben.

+0

Danke für diesen Brian, ich gebe gerade einen Versuch, den Server als "Maschine mit Growl" unter Verwendung von jgntp (http://code.google.com/p/jgntp) registrieren zu lassen. Ich frage mich, wie ähnlich Gntp zu HTTP in Bezug auf die Paketübertragung ist, keine Ahnung, wie schlecht es abziehen, aber ich komme dorthin! – patrickjquinn

Verwandte Themen