![]() |
|
|
|||||||
| Netzwerkprogrammierung Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.) |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Neuer Benutzer
Byte
Registriert seit: 30.01.2010
Beiträge: 9
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Hallo Zusammen,
ich hab mich ein bisschen in Sockets eingelesen und auch einen kl. Chat gebaut. Ist ja ne Basis-Aufgabe. So meine Frage ist, ich möchte nun z.b. das man sich Registrieren kann, das heißt das der Server also einen Befehl bekommt und zum Nutzer erstmal nur ne Text-datei anlegt. So meine Denkblockade: Es gibt ja einen Socket.InputStream. Ist der für alles Zuständig? Also darüber läuft ja jetzt quasi der Chat. Wie bring ich da nun eine zweite Aufgabe unter? Kommt alles an diesem InputStream an oder kann es zwei geben? Also quasi. 1.)jeweils nur einen Data/Input/Object-Stream? 2.)oder nur einen Stream egal welcher und ich muss quasi da differenzieren was ich machen will? Hoffe ihr versteht wo meine Blockade ist, muss eine zweite Kommunikationsaufgabe einbauen und hab das noch nirgends in einem Tutorial gelesen. Die Basis mein ich verstanden zu haben. Gruß Behnke edit: Ich bräuchte beim Clienten auch ne zweite Schiene der Kommunikation fällt mir grad auf? Muss ich einfach noch einen Socket erstellen? *verwirrt* Geändert von Behnke (30.07.2010 um 15:01 Uhr) |
|
|
|
| #2 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 04.12.2007
Beiträge: 629
Abgegebene Danke: 17
Erhielt 15 Danke für 15 Beiträge
|
nein - einfach ein vernüftiges Protokoll für die Kommunikation definieren ... im Moment kann Dein Protokoll nur Nachrichten (also Chat) senden ... das Protokoll wird also komplexer
|
|
|
|
| #3 (permalink) | ||||||||||||||||
|
Neuer Benutzer
Byte
Themenstarter
Registriert seit: 30.01.2010
Beiträge: 9
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
Das heißt z.b.: Ich definiere # als Befehlsanfang.
Beispiel: "#Register Nickname" vom Client Der Server filtert also dann "#.." im InputStream und sieht dann aha Register und ich ruf meine Funktionen auf und Antworte je nachdem wieder zum Clienten. Ist das korrekt? Gruß Edit: hab grad ein alten Thread gefunden!
Weitere Tips immer her, ansonsten probier ich mich mal daran! Geändert von Behnke (30.07.2010 um 15:50 Uhr) |
|||||||||||||||
|
|
|
|||||||||||||||
| #4 (permalink) | ||||||||||||||||||
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 16.09.2006
Beiträge: 3.748
Abgegebene Danke: 0
Erhielt 62 Danke für 62 Beiträge
|
ok, dan kram ich mal in alten beispielen... hier ein alter rechen server den man über browser ansprechen kann.. also für jeden eingehenden request wir ein eigener thread erzeugt...
__________________
Meine Beiträge stehen unter der Beerware Lizenz! |
|||||||||||||||||
|
|
|
|||||||||||||||||
| #5 (permalink) | |
|
Neuer Benutzer
Byte
Themenstarter
Registriert seit: 30.01.2010
Beiträge: 9
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
|
@ARadauer: Threads hab ich ja schon drin.
Mir gings eher um die Stream Angelegenheiten bei dem ich mir nun versuch mit einem Protokoll zu helfen. Ich mein 2 Threads mit jeweils 1 InputStream? Obwohl klingt auch garnicht so doof, weil mein Protokoll dann ja abfängt ob es für Chat/Register bestimmt ist. Aber: kommt das auch 2x an? Sobald sich das ein InputStream holt ist es doch kein zweites mal mehr da oder? |
|
|
|
| #6 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Kilobyte
Registriert seit: 28.05.2007
Beiträge: 643
Abgegebene Danke: 6
Erhielt 19 Danke für 18 Beiträge
|
![]() Du nutzt immer nur 1 InputStream, außerdem musst du jede übertragene Aktion mit dem Protokoll machen, nicht nur Sonderbefehle ![]() also: Code:
#REGISTER meinname #CHAT hi wie gehts #REGISTER maxmustermann im Chat zu senden kommt da folgendes heraus:Code:
#CHAT #REGISTER maxmustermann Ein gutes Format für das Protokoll zu definieren ist dann die nächste schwere Aufgabe. |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #7 (permalink) | |||||||||||||||||||
|
Projektleiter Plugin-System
Team Plugin-System
Registriert seit: 29.01.2009
Beiträge: 1.105
Blog-Einträge: 6
Abgegebene Danke: 26
Erhielt 56 Danke für 56 Beiträge
|
Derzeit überlege ich ob gson (also json) eine alternative für komplexere Objekte wäre. Was ich schnell gemerkt habe: bleib weg von: Objekte über ObjectOutputStream zu senden, die sind einfach zu Groß. MFG Tomate_Salat |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #8 (permalink) | |||||||||||||||||||
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.658
Abgegebene Danke: 7
Erhielt 58 Danke für 58 Beiträge
|
Aber man man mit OOS/OIS durchaus byte-sparend Dinge übertragen: Einfache Transportobjekte die nach Möglichkeit nur aus primitiven bestehen. Mach ich mit SIMON (und RMI machts nicht anders) auch so. Und die Bandbreite fliegt einem keineswegs um die Ohren... - Alex
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum |
||||||||||||||||||
|
|
|
||||||||||||||||||
| #9 (permalink) | |
|
Projektleiter Plugin-System
Team Plugin-System
Registriert seit: 29.01.2009
Beiträge: 1.105
Blog-Einträge: 6
Abgegebene Danke: 26
Erhielt 56 Danke für 56 Beiträge
|
...Getestet?!
Schau mal in meinen Block. Klar ist das Protokoll nicht ausgereift, aber mit einfachen Datentypen schlage ich den ObjectOutputStream schon jetzt um längen! Aber du kannst dir schon eine Menge bytes einsparen, wenn du z.B. auf JSON setzt. Anmerkung: und mein Update für das Protokoll wird zwar mehr Bytes brauchen, aber trotzdem noch merklich weniger als der OOS und er kann bisher Objekte behandeln, welche variablen vom Typ Number(int, float,...), Character, String und referenzen auf Objekte sind. Geändert von Tomate_Salat (30.07.2010 um 17:41 Uhr) |
|
|
|
| #10 (permalink) | |||
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.658
Abgegebene Danke: 7
Erhielt 58 Danke für 58 Beiträge
|
Klar, wenn du einen Handoptimierten Serialisierungs-Algo benutzt, dann ist das immer sparsamer als wenn man einfach "unbedacht" den OOS benutzt.
Aber nimm ein flaches Transport-Objekt das nur primitive und Arrays aus solchen beinhaltet und jag das durch den OOS. SO VIEL overhead produziert das nicht. Hab Anafangs auch gerätselt ob ich SIMON nicht noch weiter optimieren kann, hier ein zwei byte sparen, dort nochmal eins... Aber braucht man das? Codesample:
39 bytes in einem Objekt zu serialisieren, kostet 164 bytes. Macht einen Overhead von 125 bytes. Klar, das hört sich viel an. Aber hallo... 125 bytes ... Das flitzt selbst über die GPRS Leitung meines Handy nocht mit drüber ohne dass ich's merke ... Früher, zu 14k4 Modem zeiten ja... Oder 1k2 modem zeiten. Aber im Zeitalter von DSL und Handy-Flats ist es mir wurscht ob ich ein paar bytes extra habe. Auf der anderen Seite kann man argumentieren: Klar, wenn ich jetzt 1000 solcher Objekte übertragen muss, dann sind das schon 125.000 bytes. Aber selbst hier kommt der durchschnittliche Netzwerkanschluss ohne weiteres mit zurecht. Auf der anderen Seite: Man muss ja keine Transportobjekte nutzen... Man kann auch ein eigenes Marshalling, wie es RMI z.B. macht nutzen... Ist das zu übertragende etwas etwas "primitives", so nutzt man DataOutputStream und schiebt es direkt durch. Da gibts dann gar keinen Overhead. Ist es allerdings ein Objekt, so nutzt man OOS. Fertig. Aber letzten endes kommt es auf den Anwendungsbereich an. Und somit gibt's keine ultimative Lösung. Jeder wie er es für richtig hält ... - Alex P.S. JBOSS Remoting nutzt eine serialisierung die schneller und besser sein soll als die von Java direkt. Sollte man sich vermutlich mal anschauen: JBoss Serialization - JBoss Community
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum Geändert von tuxedo (30.07.2010 um 18:00 Uhr) |
||
|
|
|
|
| Lesezeichen |
Latex Maths & Physics Editor ...
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Server sauber beenden | musiKk | Netzwerkprogrammierung | 6 | 04.06.2008 20:55 |
| finlalize Methode vom Server wird nicht aufgerufen | TeacherMC | Netzwerkprogrammierung | 4 | 21.05.2007 11:01 |
| Fehler beim starten von Glassfish | siassei84 | Allgemeines EE | 0 | 26.02.2007 17:43 |
| InputStream - seltsamer Output | Rex | Allgemeine Java-Themen | 2 | 07.10.2006 16:09 |
| FindServers - Server im LAN finden! | Andy | Codeschnipsel u. Projekte | 2 | 22.09.2005 15:07 |