-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Java: XMLDe- und Encoder

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.08.2004
    Ort
    Bremen
    Alter
    26
    Beiträge
    102

    Java: XMLDe- und Encoder

    Hi Leute.

    Ich programmiere grade mit Java eine Websteuerung für ein Visual Basic Modul.
    Die Verbindung wird über TPC hergestellt (Java-seitig ein normaler ClientSocket, VB-seitig ein WinSock), das Java-Programm ist der Client, das VB-Programm der Server. Das Herstellen der Verbindung funktioniert auch und ich kann auch Streams verschicken. Allerdings habe ich noch zwei Probleme: Einerseits werden die Antworten des VB-Moduls bei mir erst ausgegeben, wenn das VB-Programm beendet wurde (Ich vermute ein Problem mit dem Puffer von BufferedReader) und zweitens weiß ich nicht, wie ich eine Ereignisstreuerung für den ClientSocket schreibe, also das wenn eine Antwort vom Server kommt, das er dann eine bestimmte Methode ausführt. Hier ist meine Java-Code:

    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    class Com
    {
    	public static void communication(BufferedReader reader, BufferedReader in, StringBuffer buffer, PrintStream out)
    	throws IOException
    	{
    		String command = reader.readLine();
    		out.print(command);
    		
    		String input = in.readLine();  
    		if (input != null)
    		{
    			buffer.append(input);
    			System.out.println(input.toString());
    		}
    	}
    
    	public static void main(String args[])
    	{
    		try
    		{
    			Socket cs = new Socket(args.length == 0 ? "localhost" : args[0], 4003);
    			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    			BufferedReader in = new BufferedReader(new InputStreamReader(cs.getInputStream()));
    			StringBuffer buffer = new StringBuffer();
    			PrintStream out = new PrintStream(cs.getOutputStream());
    			
    			communication(reader, in, buffer, out);	
    		}
    		catch(/*UnknownHostException is a*/ IOException e)
    		{
    			System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
    			return;
    		}
    	}
    }
    Kann mir jemand bei einem der beiden oder besser beiden Probleme helfen? Danke.

    MfG
    Jan

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Moin!
    Das Problem mit VB ist folgendes: Das Winshock-Modul sendet keinen Zeilenumbruch mit, auf das der Readline Befehl von deinem Java-Server wartet. Deshalb muss dein VB-Programm immer so senden:

    Winsock1.SendData "data" & vbCrLf

    Dann weiß Readline, wann alle Daten da sind, also das Ende des Datenstroms angekommen ist.

    Damit der Server auf eingehende Daten reagiert, kannst du zum Beispiel einen Thread definieren, der mit einer While-Schleife immer mit readLine() auf neue Daten wartet und mit denen dann irgend etwas macht.

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.08.2004
    Ort
    Bremen
    Alter
    26
    Beiträge
    102
    Danke!
    Das mit dem Thread ist noch so ein kleines Problem, weil ich noch nicht so gut in Java bin. Falls du grade Langeweile hast kannst du mir das ja schreiben

    MfG
    Jan

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Also ich kann dir diese Seite hier empfehlen: http://www.galileocomputing.de/openbook/javainsel3/

    Da findest du nahezu alles, was du für Java brauchst, Threads natürlich eingeschlossen, aber auch die Netzwerkgeschichten. Wenn du erst einmal keinen Thread machen willst, dann schreibe die Schleife einfach die die main-Funktion. Geht auch...

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.08.2004
    Ort
    Bremen
    Alter
    26
    Beiträge
    102
    Da kann ich dich sogar noch verbessern: Es gibt mittlerweile eine neue Ausgabe der "Insel". Im Juli ist nämlich Java "Tiger" 5 (1.5) rausgekommen und dazu gibt es gleich noch eine neue Auflage der "Insel". Ich hab das Buch auch hier neben mir stehen. Die Webadresse ist: http://www.galileocomputing.de/openbook/javainsel4/
    Siehste sogar von Noobs kann man lernen

    MfG
    Jan

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Jo, ich hatte nur den alten Link, aber hier auf der Platte verwende ich auch Version 4

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.08.2004
    Ort
    Bremen
    Alter
    26
    Beiträge
    102

    Websteurung via Applet

    Hi.

    Ich habe das ganze jetzt mit einem Thread Programmiert, alles geht wunderbar, danke nochmal.
    Jetzt kommt die nächste Geschichte. Das ganze soll als Applet auf eine Website eingebunden werden. Allerdings kenn ich mich mit Applets nicht so aus, vorallem ist die Frage ob ein Applet Sockets zulässt und ob Threads erlaubt sind. Weiß da jemand bescheid?
    Hier wieder der Code, den ich in ein Applet umschreiben will:
    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    public class Com
    {
    	public static Socket cs = null;
    	public static BufferedReader reader = null;
    	public static BufferedReader in = null;
    	public static PrintStream out = null;
    	
    	public static void main(String args[])
    	{
    		try
    		{
    			cs = new Socket("localhost", 4003);
    			reader = new BufferedReader(new InputStreamReader(System.in));
    			in = new BufferedReader(new InputStreamReader(cs.getInputStream()));
    			out = new PrintStream(cs.getOutputStream());
    			
    			Thread t1 = new Thread(new Output());
    			Thread t2 = new Thread(new Input());
    			t1.start();
    			t2.start();
    		}
    		
    		catch(/*UnknownHostException is a*/ IOException e)
    		{
    			System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
    			return;
    		}
    	}
    }
    
    class Input
    extends Com
    implements Runnable
    {
    	public void run()
    	{
    		try
    		{
    			System.out.println(in.readLine());
    			run();
    		}
    		
    		catch (IOException e)
    		{
    			System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
    			return;
    		}
    	}
    }
    
    class Output
    extends Com
    implements Runnable
    {
    	public void run()
    	{
    		try
    		{
    			out.print(reader.readLine());
    			run();
    		}
    		
    		catch (IOException e)
    		{
    			System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
    			return;
    		}
    	}
    }
    Achja, ist es möglich in einem Applet eine Konsole zu initialisieren anstatt einer graphischen Oberfläche? Weil AWT und Swing beherrsche ich noch nicht und deshalb soll das ertsmal über eine Konsole laufen, falls möglich.

    MfG
    Jan

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Moin,
    ich glaube Applet und Konsole lassen sich nicht kombinieren, aber mit Applets kenne ich mich nicht aus.

    Gruß
    Johannes
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    23.08.2004
    Ort
    Bremen
    Alter
    26
    Beiträge
    102
    Schade.
    Aber das was ich da noch programmiert hab mit den Threads, sieht das soweit gut aus? Ich hab das eben im Buch nachgelesen und geschrieben. Kann ich an der Performance noch was verbessern? Z.B. gibt es eine möglichkeit die beiden Reader und den PrintStream nicht global zu definieren? (Den Socket hab ich jetzt auch lokal definiert, eben noch geändert)

    MfG
    Jan

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2003
    Beiträge
    459
    Also optimieren im Sinne von Verbesserung der Performance kannst du glaube ich nicht mehr, aber ein paar Sachen lassen sich verschönern.

    Die Streams würde ich nicht global definieren sondern im Konstruktor deiner Runnable-Klassen erzeugen. So ungefähr, ich habe das jetzt nicht getestet:

    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    public class Com
    {
       public static Socket cs = null;
       
       public static void main(String args[])
       {
          try
          {
             cs = new Socket("localhost", 4003); 
             
             Thread t1 = new Thread(new Output( cs ));
             Thread t2 = new Thread(new Input( cs ));
             t1.start();
             t2.start();
          }
          
          catch(/*UnknownHostException is a*/ IOException e)
          {
             System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
             return;
          }
       }
    }
    
    class Input
    extends Com
    implements Runnable
    {
       BufferedReader in = null;
       public Input( Socket cs ) {
             in = new BufferedReader(new InputStreamReader(cs.getInputStream()));
       }
       public void run()
       {
          try
          {
             while( true ) {
                System.out.println(in.readLine());
             }
          }
          
          catch (IOException e)
          {
             System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
             return;
          }
       }
    }
    
    class Output
    extends Com
    implements Runnable
    {
       PrintStream out = null;
       BufferedReader reader = null;
       public Output( Socket cs ) {
             reader = new BufferedReader(new InputStreamReader(System.in));
             out = new PrintStream(cs.getOutputStream());
       }
       public void run()
       {
          try
          {
             while( true ) {
              out.print(reader.readLine());
             }
          }
          
          catch (IOException e)
          {
             System.err.println("Es ist ein Fehler aufgetreten. Das Programm wird nun beendet.");
             return;
          }
       }
    }

    Gruß
    Johannes

    P.S. Das erneute Aufrufen von run() ist nicht gut, habs mal durch die while-schleife ersetzt. Sonst hast du Rekursion...
    relaunched: http://www.mindrobots.de algorithms for intelligent robots

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •