Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Error cleaning up agent threads und WeakReference...

<< < (8/19) > >>

Mark³:
euer Engagement ist großartig, ihr habt wahrscheinlich beide eine fertige Lösung bevor das bei mir läuft  :-[

Im Prinzip nehme ich ja das KlopfKlopf-Protokoll, nur dass ich das nicht in einer extra Klasse ausgelagert habe. Ich möchte natürlich auch gerne verstehen, was ich tue. Und in allen Beispielen, die ich irgendwo gefunden habe, wird ein InputStream in einer while-Schleife ausgelesen:

--- Code: ---while ((c = in.read()) != -1) {
     sb.append((char) c);
}
--- Ende Code ---
Wieso ist das dann bei mir eine Endlos-Schleife? Sind alle Beispiele so stark vereinfacht? Oder läuft das nur, wenn die Gegenseite den dazugehörigen Outputstream mit einem Textprompt füllt und nicht programmatisch?
Natürlich läuft es bei mir, wenn ich auf der Gegenseite (im Notesagenten) outputStream.close() mache, aber das habe ich nirgendwo so gesehen.

Die Notesdokument-UID möchte ich übrigens nicht übergeben, da ich meine Mittelschicht gern unabhängig von Notes bauen möchte. D.h. der Server kennt bestimmte Befehle, die dazugehörige Anzahl von Parametern verlangen und gibt dann passende Antworten zurück. So kann ich das Tool dann auch von Nicht-Notesanwendungen nutzen.

Mark³:
und multithreaded brauch ich natürlich auch, sollte bereits drin sein. Ich muss aber noch die maximale Anzahl von parallelen Threads einbauen da Openview nicht beliebig viele Verbindungen mit dem gleichen User erlaubt.

Multithreading:

--- Code: ---ServerSocket httpd = new ServerSocket(port);
while (true) {
Socket socket = httpd.accept();
(new ClientThread(getOVSession(ovserver, ovuser, ovpw), ++calls, socket)).start();

--- Ende Code ---

Mark³:
ich glaube ich habe meinen Fehler gefunden: Ich benötige überhaupt gar keine while-Schleife im Client oder ClientThread, da der Ablauf der folgende ist:

1. Client C öffnet Socket zum Server
2. Server erstellt neuen Clientthread CT1
3. C schickt eine Zeile mit einem Befehl und Parametern zum CT1
4. CT1 führt den Befehl in Openview aus und schickt eine Zeile als Antwort zurück zu C
5. C empfängt die Antwort und schließt den Socket, daadurch beendet sich CT1

So einfach ist das. Und läuft.
Das ist eben der Nachteil am Cut&Paste programmieren, solange man den Code nicht wirklich versteht passieren oft unerwartete Sachen  O0

Mark³:
was natürlich ohne die Schleife nicht mehr funktioniert:

Ich kann nicht mehr während einer Client-Sitzung mehrere Befehle abarbeiten, was eigentlich ganz schön wäre. Also muss ich irgendwann doch mal das Problem lösen, wie Client und Server abwechselnd miteinander reden können ohne endlos auf den Abschluss der Eingabe zu warten.
In den Beispielen wurde ja immer System.in o.ä. genutzt und da merkt die Gegenseite scheinbar wann die Eingabe beendet ist (nach einem Enter also \r \n wahrscheinlich). Ich kann dann wohl ein Steuerzeichen definieren, welches die Kommunikation jeweils begrenzt (z.B. ~) da ein im String vorhandenes \n nicht klappte...

flaite:
Bei mehreren Befehlen würde ich im Namen der Einfachheit für jeden Befehl eine neue Verbindung aufbauen.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln