Cyborg11 186 Melden Geschrieben 27. Juni 2011 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 ...
gonzo_the_great 0 Melden Geschrieben 27. Juni 2011 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.... 50ct
Cyborg11 186 Melden Geschrieben 27. Juni 2011 (bearbeitet) Nur blöd, dass die Abgabe am Mittwoch ist, also muss ich meinen Chat zum Laufen bringen 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 27. Juni 2011 von Cyborg11
Buggy McDermit 165 Melden Geschrieben 27. Juni 2011 (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 27. Juni 2011 von Buggy McDermit
Cyborg11 186 Melden Geschrieben 28. Juni 2011 (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 28. Juni 2011 von Cyborg11
Buggy McDermit 165 Melden Geschrieben 28. Juni 2011 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...
Cyborg11 186 Melden Geschrieben 28. Juni 2011 (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 28. Juni 2011 von Cyborg11
Striker 75 Melden Geschrieben 28. Juni 2011 Berufschulbedingt Bascom, und seit der Realschule auch HTML
Cyborg11 186 Melden Geschrieben 17. Juli 2011 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?
LurchiDerLurch 0 Melden Geschrieben 17. Juli 2011 (bearbeitet) liste vorher sortieren? was allerdings noch länger dauern kann ^^ Bearbeitet 17. Juli 2011 von LurchiDerLurch
Cyborg11 186 Melden Geschrieben 17. Juli 2011 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 So sollte die Sortierung auch bleiben, sonst könnte es später zu anderen Problemen führen.
Cyborg11 186 Melden Geschrieben 17. Juli 2011 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?
Buggy McDermit 165 Melden Geschrieben 17. Juli 2011 (bearbeitet) Jop Schauste u.a. hier für dein komisches Java http://galactica.dyndns.org/java/book/java...nsel_11_005.htm Bearbeitet 17. Juli 2011 von Buggy McDermit