Zum Inhalt springen
Malarkey

Coder-Stübchen

Empfohlene Beiträge

Geschrieben
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 ... -_-

Geschrieben

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

Geschrieben (bearbeitet)

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?

Bearbeitet von Cyborg11
Geschrieben (bearbeitet)

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.

Bearbeitet von Buggy McDermit
Geschrieben (bearbeitet)

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.

Bearbeitet von Cyborg11
Geschrieben

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

Geschrieben (bearbeitet)

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 :(

Bearbeitet von Cyborg11
Geschrieben

Berufschulbedingt Bascom, und seit der Realschule auch HTML

Geschrieben

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?

Geschrieben (bearbeitet)

liste vorher sortieren?

was allerdings noch länger dauern kann ^^

Bearbeitet von LurchiDerLurch
Geschrieben

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.

Geschrieben

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?

Geschrieben

Java ist nicht komisch :P

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden


  • Wer ist Online   0 Benutzer

    • Keine registrierten Benutzer online.
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.