Portal > Foren > Java > Allgemeine Java-Programmierung > kommunikation 2 programme
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 19.09.2005, 01:25 Nach oben    #1
diggy
Gast
 
Beiträge: n/a
Standard kommunikation 2 programme

hallo forum,

hab 2 programme. Einer ist "watcher" und soll nur abfragen können ob mein 2-tes Programm "Server" läuft. Wenn nicht soll der "watcher" eine entsprechende Meldung geben. Die beiden sollen gewissermassen komunizieren können. Wie ist es am Besten das Problemm zu lösen?
Für jede Hilfe bin ich sehr dankbar...

Gruß
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 06:57 Nach oben    #2
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Laufen die beiden Programme auf dem selben Rechner, oder läuft der Server auf einem anderen Rechner als der Watcher?

Wenn letzteres der Fall ist, richte auf dem Server einen Socket ein, auf den er lauscht.
Vom Client aus öffnest du dann eine Verbindung zum Server und sendest eine Zeichenkette. z. B. "ON". Gleichzeitig setzt du den Time-Out der Verbindung auf 10 Sekunden.
Der Server lauscht ja auf den Port, bei der eingehenden Verbindung öffnest du einen Thread der die eingehende Zeichenkette prüft, ist die Zeichenkette "ON" antwortet der Server: "YES"

Was passieren kann:
1. Der Server läuft nicht, dann kommt es beim Aufbau bereits zu einem Fehler (Connection refused)
2. Der Server antwortet nicht, dann wirft der Socket ebenfalls einen Fehler (Connection Timed Out)
3. Der Server antwortet, dann brauchst du nur noch prüfen ob der Servr die Zeichenkette "YES" antwortet.

Wie das ganze funktioniert ist recht gut beschrieben in "Java ist auch eine Insel", und zwar in diesem Kapitel.

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 15:19 Nach oben    #3
diggy
Gast
 
Beiträge: n/a
Standard

Es klingt sehr bedacht das Ganze. Ich mache mich dann an die Arbeit. Wenn fertig, schreibe ich dann zurück ob es geklappt hat.

Gruß und schönen Dank
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 18:48 Nach oben    #4
diggy
Gast
 
Beiträge: n/a
Standard

Hallo sparrow,
hab mich Heute mit deinem Vorschlag beschäftigt und nur teilweise erfolg gehabt. Hab folgenden Code eingebaut:

PHP-Code:
public class Client extends Thread{
    public 
Client() {
    }
    public static 
void mainString args[] ) {
        new 
Client().start();
    }    
    public 
void run() {
        try{
            
Socket server = new Socket"localhost"3141 );
            
InputStream in server.getInputStream();
            
OutputStream out server.getOutputStream();
            
int antwort=0;
            while(
true){
             
out.write(1);             
                
antwort in.read();
                if (
antwort == 1)
                 
System.out.println("Antwort vom Server ist: Ich lebe! :-)");
                else 
                 
System.out.println("Keine Rückmeldung vom Server!!!!!");
                
Thread.sleep(1000);
            }
        }catch(
Exception w){
            
System.out.println(w.getLocalizedMessage());
        }
        
    }
}

public class 
EchoServer extends Thread{
    public static 
void mainString args[] ) throws IOException {
        new 
EchoServer().start();
    }
    
    public 
void run() {
        try{
        
ServerSocket server = new ServerSocket3141 );        
        while ( 
true ) {
            
Socket client server.accept();
            
InputStream  in  client.getInputStream();
            
OutputStream out client.getOutputStream();
            
int antwort in.read();
            
out.writeantwort );
            
Thread.sleep(100);
            
client.close();
        }
        }catch (
Exception e){
            
System.out.println(e.getLocalizedMessage());
        }
    }

Allerdings läuft dies höchstens einmal gut durch, danach ist schluss. Entweder Connection refused, oder meine Fehlermeldung oder socket write Error...

Was soll ich an dem Code verbessern?

Danke im voraus
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 21:01 Nach oben    #5
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Also eins vorweg, wir bauen hier ja keinen reinen Echo-Server. Ansonsten könnten wir den Server einfach anpingen, aber wir wollen ja zusätzlich noch wissen ob die Application einwandfrei funktioniert.

Ich glaube das Problem liegt auf der Serverseite.
Deshalb meinte ich ja, du sollst jede Anfrage in einem extra Thread behandeln.

Ich gehe bei meinen Server-Programmen immer wie folgt vor:

Ich initialisiere eine Thread, ebenso wie du, in dem ich in einer while-schleife immer wieder folgedes ausführe:

PHP-Code:
    public void run() {
        
int cnt 0;
        try {
            
servSocket = new ServerSocket(12816);
        } catch (
IOException e) {
            
System.out.println("Error!\nCan't open the socket!");
            
System.out.println(e.getMessage());
            
System.out.println("  -ABORTING-");
            
System.exit(1);
        }
        while (!
stopThread) {
            try {
                
Socket socket servSocket.accept();
                new 
ClientCon(socketcnt).start();
                
cnt++;
            } catch (
IOException e1) {
                
// TODO Auto-generated catch block
                // e1.printStackTrace();
                
System.out.println(e1.getMessage());
            }
        }
        
    } 
Wie du sheist wird der Socket an eine neue Instanz einer Klasse namens ClientCon übergeben, zusammen mit einer hochzählenden Nummer. Die ist aber nur da, damit jeder Thread eine ID hat, find ich ganz gut, so kann ich sehen wie oft schon eine Verbindung aufgebaut wurde.

PHP-Code:
public class ClientCon extends Thread {
    
    
Socket socket;
    
int cnt;
    
InputStream in;
    
OutputStream out;
    
    public 
ClientCon(Socket socketint cnt) {
        
this.socket socket;
        
this.cnt cnt;
    }
    
    public 
void run() {
        
System.out.println("Server: Verbindung hergestellt: " cnt);
        try {
            
in socket.getInputStream();
            
out socket.getOutputStream();
            
StringBuffer buf = new StringBuffer();
            
int c;
            while ((
in.read()) != -1) {
                if ((
char== '%') {
                    
parser(buf);
                    
buf = new StringBuffer();
                }

                
buf.append((charc);
            }
        } catch (
IOException e) {
            
System.out.println("Fehler beim anlegen der Verbindung füer: " cnt);
        }
        
System.out.println("Verbindung durch Client getrennt: " +cnt);
    } 

Das ist viel Code der überflüssig ist, aber er zeigt, wie der Socket in einem weiteren Thread weiterbehandelt wird.

--------------

Bei dir scheint das Problem zu sein, dass der Server ja einen Moment braucht um zu reagieren, in diesem Augenblick, plus die Zeit die der Server auch noch wartet (sleep(100)) ist der Server nicht zu erreichen.


Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 21:48 Nach oben    #6
diggy
Gast
 
Beiträge: n/a
Standard

Danke für deine Hilfe Sparrow,

Das mit Anpingen vom Server gefällt mir schon, allerdings wenn wir damit nicht feststellen können ob der Server immer noch funktioniert, nutzt das ja nicht sehr viel.

was ist denn eigentlich parser(buf); Und der obere Abschnitt von deinem Code
PHP-Code:
public void run() { 
        
int cnt 0
        try { 
            
servSocket = new ServerSocket(12816); 
        } catch (
IOException e) { 
            
System.out.println("Error!\nCan't open the socket!"); 
            
System.out.println(e.getMessage()); 
            
System.out.println("  -ABORTING-"); 
            
System.exit(1); 
        } 
        while (!
stopThread) { 
            try { 
                
Socket socket servSocket.accept(); 
                new 
ClientCon(socketcnt).start(); 
                
cnt++; 
            } catch (
IOException e1) { 
                
System.out.println(e1.getMessage()); 
            } 
        }          
    } 
soll ja zum Client oder zum Server gehören? Sorry für manche Fragen die dir vielleicht einfach erscheinen, bin aber relativ neu in dieser Welt.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2005, 22:15 Nach oben    #7
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Sorry, das mit dem Parser kannst du vergessen.
Ich hatte eigentlich gedacht, ich hab alles rausgenommen was Programmspezifisch ist.
Hinter der Methode verbirgt sich eine einfache überprüfung, was der Client gesendet hat, und wie der Server darauf reagiert.

Alle Codeteile gehören zum Server.
Es geht hauptsächlich darum zu zeigen, dass mit dem eingehen eines neuen Sockets ein neuer Thread geöffnet wird.

Sehr gut ist das ganze Erklärt im Handbuch der Java-Programmierung.
Die HTML-Version kannst du kostenlos unter http://www.javabuch.de herunterladen.
Das Buch ist wirklich klasse, dort gibt es in Kapitel 45.3 die Erklärung wie man einen eigenen Webserver programmiert. Natürlich recht einfach gehalten.
Es geht auch weniger darum HTML-Seiten ausliefern zu können, aber dafür ist sehr gut beschrieben wie der ServerSocket lauscht und warum man die Verarbeitug in einen extra Thread leisten soll.
Überhaupt ist das Javabuch mein absoluter Favorit, und das Kapitel Netzwerkprogrammierung solltest du dir anschauen, es ist wirklich sehr gut beschrieben.

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Warum C Programme auf Webseiten? Skinwalker Sonstige Programmiersprachen 12 31.08.2007 16:44
Pagosoft AppStarter - Programme starten, aber effizient pago Projekte unserer Mitglieder 38 28.02.2007 22:34
Welche Programme ? Richie-4 Allgemeine Java-Programmierung 2 21.02.2005 13:23
Programme von mir !!! X_Master Projekte unserer Mitglieder 4 03.02.2005 17:12
Diverse Programme Gottzilla Projekte unserer Mitglieder 2 03.02.2005 12:52


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45