C# Wrapper für Java Programm - Streams

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

C# Wrapper für Java Programm - Streams

Beitrag von The_Real_Black »

Code: Alles auswählen

			try {
				if(server != null && !server.HasExited && !server.StandardError.EndOfStream) {
					s = server.StandardError.ReadLine();
				}
				if(!String.IsNullOrEmpty(s)) {
					txt_LogError.Text = s + Environment.NewLine + txt_LogError.Text;
				}
			} catch(Exception ex) {
				MessageBox.Show(ex.Message);
			}
"server" ist ein Process.

Ich habe einen Java basierten Server ohne "Gui" als eine Art Dienst am laufen bzw mit gui einer hässlichen Konsole.
Deshalb wollte ich einen Wrapper C# schreiben um eine "Idiotensichere" Oberfläche zu bekommen.
zB um die Serversteuerung und Überwachung als Trayicon zu realisieren und befehle mit klick zu realisieren.

Leider friert mir immer der Wrapper ein und auch der server arbeitet nicht richtig wenn er mit Wrapper betireben wird.
Was müsste man alles Abprüfen, damit das auslesen nicht fehlschlägt?
Da auch Visual Studio mit einfriert bin ich mir nicht sicher ob es jetzt beim Zugriff auf
server.StandardError.EndOfStream
oder
server.StandardError.ReadLine();
einfriert.
Ich konnte den Haltepunkt auf "ReadLine" nicht anspringen, da VS vorher einfriert. Wenn ich nicht auf EndOfStream
prüfen darf und Position, Timeout, usw nicht unterstützt werden habe ich keine Ahnung was ich sonst machen kann.
Zuletzt geändert von Seraph am 30.05.2011, 12:08, insgesamt 1-mal geändert.
Grund: 'r' zum Titel hinzugefuegt
Happy Coding.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: C# Wrapper für Java Programm - Steams

Beitrag von Chromanoid »

Warum machst du das nicht auch mit Java? http://download.oracle.com/javase/6/doc ... yIcon.html Wenn du an den Server-Code kommst, wäre eine Überwachung/Steuerung per JConsole/MBean vielleicht auch interessant. Für JMX gibts bestimmt auch nen .Net Client. JMX ist, wenn man das z.B. wie über JGroups oder ich glaube Java 7 hat das auch, mit Annotationen füttern kann ziemlich geil. Man kann dann Objekte einfach als @MBean und Methoden einfach als @ManagedOperation annotieren und dann per JConsole die Funktionen ausführen. Wenn die User von den Informationen in JConsole überfordert sind, kannst du ein JConsole Plugin für den Server basteln. Das ist gar nicht so schwer, man muss AFAIK einfach von JConsolePlugin erben... Bei meinem aktuellen Projekt arbeite ich auch mit JMX und bin hoch zufrieden. Ich nutze Google Guice für Dependency Injection und im Grunde diesen Code. Das ganze ist auch super um schnell mal neue Funktionen auszuprobieren. Einfach die zu testenden Methoden als ManagedOperation markieren und dann hat man sofort die Methoden in JConsole zur Verfügung. Falls du noch nichts mit JConsole gemacht hast hier mal ein Screenshot:
jmx.png
Links oben sieht man ein paar Funktionen, die ich zum testen mit ManagedOperation markiert habe...

Wenn der Wrapper den Server einfriert, dann ist der auch irgendwie überarbeitungswürdig :) wer weiß was ihn dann noch so einfriert ^^ könnte aber auch irgendwie mit blocken des Prozesses durch die Konsolenabfrage zusammenhängen :). Das hier mal angeschaut: http://www.codeproject.com/KB/string/Co ... elper.aspx / http://www.codeproject.com/script/Artic ... er_src.zip?

Hast du mal versucht zusätzlich auch die anderen umgeleiteten Streams abzufragen/zu leeren?
Edit2: Ist glaube ich Schwachsinn und kann weg... Edit: ich glaube das zeug friert ein, weil die ausgabe buffer beim lesen nicht voll sind und solange abgefragt wird bis was zu lesen ist - evt. musst du auch andere umgeleitete buffer leeren. Vielleicht geht es irgendwie so (andere umgeleitete Buffer auch so abfragen...):

Code: Alles auswählen

System.Timers.Timer timer= new System.Timers.Timer();
timer.Elapsed+=new ElapsedEventHandler(ReadOutput);
timer.Interval=100;
timer.Enabled=true;
//...
private void ReadOutput(object source, ElapsedEventArgs e)
{
    try{
        string s="";
        while(server.StandardError.Peek()>=0){
            s+=server.StandardError.Read();
        }        
        if(!String.IsNullOrEmpty(s)) {
            txt_LogError.Text = txt_LogError.Text + s;
        }
    } catch(Exception ex) {
        MessageBox.Show(ex.Message);
    }
}
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: C# Wrapper für Java Programm - Steams

Beitrag von The_Real_Black »

@"Wieso nicht Java": Ich hab schon einen C# Server mit Verwaltungskonsole. Wenn die Module alle arbeiten kann man auch die Teile zusammen führen um eine "universale Fernbedienung der Serverteile" zu bekommen.

@"Streams abzufragen/zu leeren": Hatte ich nach dem Post auch mal versucht, aber hat so nicht geklappt.

@"codeproject": Danke für die links ich muss jetzt erstmal vergleichen wo die anders arbeiten ^^

Danke. :D
Happy Coding.
Antworten