Jump to content
Malarkey

Coder-Stübchen

Recommended Posts

Zum Casten:

Mein Vorschlag wäre (hab ich selber schon so gemacht): Klassen, welche von Server UND Client genutzt werden in ein extra Package. Auf dieses Package greifen dann halt beide zu

Jo hab ich jetzt so gemacht. Client importiert die relevanten Servermodel Klassen.

Gibt es eigentlich irgendwo .logs von Java, wo ich sehen kann, warum sich mein Client immer aufhängt?

Wenn ich nämlich mit 2 Clients connecte und jeder Client will die Userlist, dann klappt es bei dem einen und der andere Client hängt sich einfach auf. Der wartet anscheinend noch auf die Antwort des Servers, aber da kommt nichts zurück -_-

Auf dem Server läuft ein Thread, der auf weitere Clients mit der accept() Methode in einer while Schleife wartet. Wenn dann ein Client connected, wird ein weiterer Kommunikationsthread erstellt.

Verbinden sich jetzt zwei Clients zum Server, müsste es doch zwei solcher Kommunikationsthreads geben oder?

Also warum kommen sich die Clients dann mit dem Output/InputStream in die Quere?

Daran muss es einfach liegen ... -_-

Share this post


Link to post
Share on other sites

mal mein senf nur zum chat: ich wurde die sich mit udp-nachrichten tot stampfen lassen. jeder hoert das was er hoert und pollt es. umgehkehrt natuerlich auch. hast du sonst nicht zuviel trouble mitzukriegen ob der verbindungsaufbau klappte und die tcp verbindung noch steht?

wenn du von einem modell ausgehst wo du nicht alles hoeren musst, der sender also auch so oft seine nachricht wiederholt bis er eine bestaetigung kreigt (die natuerlich auch genuegend oft) verschickt wird muesste dass doch klappen. schoen mit eigenen puffern arbeiten, deadlines setzen und scoresystem einfuegen.

...ach mist, mein xfire ist wieder 3 min hinter dem letzte offline zurueck....

:D 50ct

Share this post


Link to post
Share on other sites

Nur blöd, dass die Abgabe am Mittwoch ist, also muss ich meinen Chat zum Laufen bringen :P

Ok, mein Client hängt sich schonmal nicht mehr auf, wenn ich die Userlist hole, da ich das jetzt in einen eigenen Thread ausgelagert habe.

Das Problem ist jetzt nur, wenn zwei Clients verbunden sind und jeder holt sich die Liste, dann funktioniert es kein zweites Mal. Der Server empfängt in diesem Moment nichts.

Könnte es an der writeUTF() Methode des ObjecOutputStreams liegen?

Ich glaub ich schreib jetzt wieder alles auf BufferedReader / PrintWriter um und schau mal, ob es dann geht. :|

Oder sollte ich die ObjectStreams nach jedem Senden aufm Client schließen und jedes Mal erneut öffnen, wenn ich etwas senden möchte?

Edited by Cyborg11

Share this post


Link to post
Share on other sites

Du arbeitest mit Sockets richtig ?

Ich kenne das jetzt nur gut aus der C-Programmierung, aber wenn du einen parallelen Server programmierst ist es meistens ein "Anfängerfehler" das der Port des Servers belegt ist, wenn zwei Clients connecten. Willst du es nacheinander machen wäre in C (bei TCP) die Möglichkeit via listen(int socketdeskriptor, int warteschlangenlänge) eine FIFO zu nutzen.

Bei parallelen Servern würde ich in C für jeden erfolgreichen Verbindungsaufbau mit Clients einen Kindprozess "forken" und diesen die Anfrage abarbeiten lassen, da Java fork() nicht anbietet sind Threads die Lösung.

Bevor ich hier jetzt aufgrund mangelnder Praxis fehlerhaften Java Quellcode hinklatsche verlinke ich lieber mal zu nem Webbeispiel ;)

http://www.kodejava.org/examples/216.html

Pollen würde ich nicht empfehlen, wenn es eine Note gibt und der Abnehmer/Lehrer ahnung hat ;) , da dadurch zuviel Serverlast entsteht das will in der Praxis niemand.

Viel Erfolg !

Edit:

http://download.oracle.com/javase/1.4.2/do...rverSocket.html

Bei voller Warteschlange (Backlog) (weil die Clients nicht mit accept() abgeholt werden) würde ich ne Exception werfen im Client werfen und schauen ob "connection refused" (oder wie auch immer in Java) an den Client zurückgegeben wird.

Edited by Buggy McDermit

Share this post


Link to post
Share on other sites

So ähnlich schaut auch mein Server aus, nur dass das "Lauschen" auf weitere Clients in einem endloswiederholenden Thread läuft, genauso wie die Kommunikation: http://pastebin.com/SHpZ2D03

Das ist der NetworkController vom Client: http://pastebin.com/0tzrU002

Wenn ein Client verbunden ist, geht das Aktualisieren der userList dauerhaft. Kommt nun noch ein zweiter Client hinzu, scheint es Probleme bei dem Rausschreiben des "List" Strings zu geben, da mir der Server in der Konsole keine Nachricht mehr ausgibt, also empfängt der Server in diesem Moment nichts mehr vom Client.

Login und Registrieren funktioniert aber, wenn zwei Clients vorhanden sind.

Edited by Cyborg11

Share this post


Link to post
Share on other sites

Habe den Code aus Zeitmangel gerade nur überflogen, aber wenn sich der zweite Client verbindet bekommt der doch keine eigene Referenz in der Klasse ClientListenerThread (this.socket oder wie auch immer) oder habe ich das übersehen?

Dadurch hat der Server keine "Adresse" an wen er die Nachricht schicken muß, da der Handler nur die Referenz für Client1 kennt. Im von mir verlinkten Beispiel so um Zeile 47 zu finde was ich meine ;)

Muß aber auch zugeben das ich ewig kein Java gecoded habe vielleicht ist das auch Schmuh was ich hier schreibe... :o

Share this post


Link to post
Share on other sites

Den Fehler hab ich auch schon entdeckt und behoben, danke :)

Also Zwischenstand: Client 1 verbindet, kann die Liste dauerhaft anfordern. Client 2 verbindet, kann die Liste dauerhaft anfordern, aber Client 1 kann weder die Liste anfordern noch sich abmelden.

Irgendwie wird auf dem Server der Input/OutputStream von Client 1 überlagert und somit empfängt der Server von Client 1 nichts mehr.

Hier nochmal die neuen Codes:

ServerNetworkController: http://pastebin.com/hN7jYSZM

ClientNetworkController: http://pastebin.com/CTi6AWNd

Ich verzweifle langsam, weil ich einfach nicht sehe, wo mein Fehler ist :(

Edited by Cyborg11

Share this post


Link to post
Share on other sites

Wie könnte man das Vergleichen zweier ArrayListen optimieren?

Beide Listen werden durchlaufen. Es soll überprüft werden, ob ein Element in der ersten Liste auch in der zweiten Liste vorkommt. Ist dies der Fall wird die Schleife beendet.

Im worst case Fall wird aber die komplette zweite Liste durchlaufen, also eine Laufzeitkomplexität von n.

Da die erste Liste auch komplett durchlaufen wird, geht die Laufzeit auf n² hoch.

Kann ich die irgendwie auf log(n) biegen oder muss ich dafür auf Bäume zurückgreifen?

Share this post


Link to post
Share on other sites

Ach quatsch, keine ArrayList ^^ Zweidimensionales Array :)

Ich lese nämlich zwei Dateien ein und jede Datei wird in einem zweidimensionalen Array gespeichert [spaltenindex][Zeilenindex]. Also sind die Dateien schonmal zeilenweise sortiert :P

So sollte die Sortierung auch bleiben, sonst könnte es später zu anderen Problemen führen.

Share this post


Link to post
Share on other sites

Stimmt mit einer HashMap könnte ich arbeiten. Meinst du doch oder?

Nur ist die Frage was ich als Schlüssel speichere, jeweils immer nur die einzelnen Zeilen?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.