ERLEDIGT
JA
JA
ANTWORTEN
10
10
ZUGRIFFE
3046
3046
EMPFEHLEN
-
Hallo zusammen,
ich bin gerade dabei einen Multi Socket Server mit VB.NET und Threads zu erstellen allerdings stehe ich dort vor einigen oder gar vielen Problemen.
Als Info: Der Server soll nachher als Mutli-Game Server dienen. Mit einigen (1 - 20 vllt) Spielern pro Server - wenn mehr möglich natürlich auch gerne mehr
) Die Clienten werden alles Flash-Anwendungen sein.
So nehme ich derzeit eine Verbindung an:
Code :1 2 3
client = Server.AcceptTcpClient() Dim myThread As New Thread(AddressOf clientThreads) myThread.Start()
Habe ich das soweit schonmal richtig verstanden oder bin ich ab da schon auf dem falschen Dampfer?
In dem "Sub" clientThreads, welches ja quasi kopiert und immer wieder ausgeführt wird, wird der Stream gelesen, oder?
Doch nun stehe ich vor einigen Fragen:
Wie lese ich dem Stream aus? Ich könnte ihn an der Thread übergebenund den Sub alaCode :1
myThread.Start(stream)
aufrufen.Code :1
private sub clientThreads(byval stream as networkstream)
Aber dann habe ich das Problem das ich nicht die Nachricht die in Thread A empfangen wird an Thread B - Z zu senden. Desweiteren müssen die Clienten ja irgendwo "gespeichert" werden. Vielleicht in einem Array? Aber gibt es dort nicht eine schönere Möglichkeit?
Also irgendwie verstehe ich dieses "MULTI-SERVER" ding noch nicht so ganz. Kann mir dort mal jemand eine gescheite Übersicht Posten, wie das Ablaufen muss? Codes brauche ich eig. nicht, dass bekomm ich noch selber her, aber den Ablauf, verstehe ich nicht so ganz.
Eine einfache Server - Client verbindung bekomme ich Problemlos hin. Sobald aber mehrere Clienten auf einen Server zugreifen sollen und untereinander kommunizieren sollen hat sich das bei mir erledigt.
In meinen hunderten Versuchen hatte ich bisher eine "Struktur" die gelaufen ist, allerdings nicht das Gelbe vom Ei ist
- Server Starten
- Client verbindung startet Thread und übergibt Client-Stream
- Bei Client-Verbindung wird in ein Array der Stream vom Clienten gespeichert.
- Thread:
-- Mit Loop stream auslesen
-- Empfangenen Text in ne Listbox (lol)
- Timer:
-- Listbox (mit empfangenen Text) durchlaufen und an andere Clienten weiterleiten die im Array gespeichert sind (...)
Das gab allerdings mehrere Probleme z.b. wenn der Client einfach geschlossen wurde aber nicht das "exit" kommando gesendet hat. Dann wurde er z.b. nicht aus dem Array gelöscht und es wurde die ganze zeit versucht weiter zu senden..
Also, ich bin für jeden tip SEHR dankbar.
Zum Thema Google: Ich habe schon viele hunderte Seiten gefunden. Habe auch schon schöne Code-Beispiele gefunden. Allerdings waren die meist ohne Erklärung oder absolut unverständlich.
Gruß
string
-
24.02.09 13:29 #2
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Hi.
Erstelle eigene Klasse, welche für die direkte Kommunikation mit den Clients verantwortlich sind.
Wenn ein neuer Client verbindet (nach AcceptTcpClient) erstellst du eine Instanz der Klasse, übergibst dieser den TcpClient, und beim Erstellen des Threads gibst eine Methode dieses Objekts an.
Dann speicherst dieses Objekt in einer Liste, und bist ansich fertig mit diesem einen Client, und kannst auf den nächsten Thread warten.
Wenn du jetzt Nachrichten verschicken willst, brauchst nur deine Liste durchgehen, und mit jedem Objekt die Nachricht verschicken. Dabei kannst du diese "ClientKlasse" so gestalten, dass du auch gar nicht den direkten Zugriff auf den Stream brauchst, sondern über eine eigene Write Methode.
Zu deinem Problem, wenn ein Client die Verbindung beendet ohne den exit Befehl zu senden: Beim Schrieben kannst dann ja den Status des Streams abfragen, und wenn der Stream abbricht, wird (irgendwann) eine Exception geworfen, spätestens wenn du was schicken willst, und der Stream aber schon weg ist.
Hoffe das hilft dir mal weiter.
lg,..With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
Gut, soweit habe ich das ja eigentlich. Nur jetzt wieder meine Frage: Was für eine Liste? Ein Array? ListBox? DataTable? Hashtable? Welche ist am schnellsten? Welche eignet sich für meine zwecke?
Nehmen wir an:
Client A öffnet seinen Clienten und Connectet am Server. Der Server erstellt nun einen Thread (evt. mit einer Klasse) und hält dessen Stream offen. Dann öffnet sich ein weiterer Client B und Connectet am Server.
Jetzt habe ich auf dem Server eine Liste - wo Client A und B eingetragen sind. Bis auf dass ich nicht weiß welche Liste am besten ist, ist mir das soweit schonmal klar.
Jetzt: Wie sende ich vom Client A die nachricht an Client B. Brauche ich also eine weitere Liste in der die Nachrichten gesammelt werden und dann weiter geleitet werden? Quasi: Client A - an Server - Server an Liste - Timer (ect.?) Durchläuft liste und sendet an alle Clienten - oder wie mache ich das sonst?
Gruß
paDGeändert von String (24.02.09 um 14:15 Uhr)
-
24.02.09 14:32 #4
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Wie wäre es mit der System.Collections.Generic.List?

Das Weiterleiten der Nachrichten könntest so machen wie du es beschrieben hast, ja.With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
Ok, List klappt schonmal soweit.
Aber nun wieder ein Problem:
Client eigenschaften? Wie löse ich das? Z.b. Namen, Positionen, oder auch einfach nur eine Farbe.
In dieser List kann ich ja quasi nur die Streams speicher oder sehe ich das falsch?
Sagen wir mal ich will name, farbe und den Stream eines Users "speichern/verwalten"
Wie mache ich das dann?
-
24.02.09 15:07 #6
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
AAAHHH jetzt verstehe ich (glaube ich)
Also Klasse Clienten:
- Hier wird alles gespeichert // Name, Farbe, Position ect.
- Funktionen zum Lesen und Schreiben
Liste:
- Hier wird quasi die "klassen-Instanz" als Objekt gespeichert
Thread:
- An dem Thread wird also die Klassen-Instanz geleitet.
- Dieser Liest und Schreibt ggb. die Streams
Verstehe ich das richtig? Oder habe ich jetzt immernoch einen Denkfehler?
Noch eine Frage: Wie speichere ich die Klassen-Instanz in der Liste?
Ist das soweit richtig? Wenn ja, wie kann ich denn einen Clienten nachher wieder löschen. Daher ich einfach nur Clients.Add(neuerClient) speichere, kann ich nachher nicht mit Clients.Remove() arbeiten oder?Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Dim clients As New List(Of Object) .... // Bei Clientverbindung Dim neuerClient as new Client(ServerAcceptTcpClient()) Clients.Add(neuerClient) - Thread starten, der die Klasse weiterhin verarbeitet.. Public Class Client Dim stream As NetworkStream Dim name As String .. usw... Sub New(ByVal cstream As NetworkStream) s... End Sub End Class
-
24.02.09 16:32 #8
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Die Liste kannst ruhig mit "List (of Client)" erstellen, immerhin willst ja Client-Objekte drin speichern.
Natürlich kannst mit Remove die Objekte aus der Liste entfernen.
Bei so Sachen wo du eine Theorie hast, dir aber nicht sicher bist.. probiers doch einfach aus. Da merkst dann ja oft von selbst, obs geht oder nicht.
With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
Bestens =) =) =)
Jetzt läuft alles soweit.
Leider tritt nun ein ganz anderer Fehler auf:
100 % CPU belastung, sobald ein Client connectet.
Hast du ne Idee, woran das liegt?Geändert von String (24.02.09 um 17:29 Uhr)
-
24.02.09 17:21 #10
- Registriert seit
- Aug 2001
- Ort
- Österreich, Stmk, Graz
- Beiträge
- 2.783
Deine "Lesen"-Methode liest nicht vom Stream. Deswegen blockiert da auch nichts, und die Schleife rennt munter vor sich hin. Deswegen hast 100% CPU Last.
With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
Aaron Satie
Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
Captain Jean-Luc Picard, Stardate ~41294.5
Tutorials.de chattet. Hier gibts auch .net Support ^^
Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de
(moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions
-
peinlich... das wars - vielen Dank für die schnelle und kompetente Hilfe!
Gruß
string
Ähnliche Themen
-
Flash <-> Server komunikation mit Socket :: Server mit Java, PHP oder was anderem?
Von PHs im Forum Flash PlattformAntworten: 0Letzter Beitrag: 26.01.08, 16:02 -
MSSQL -> DUMP mit PHP oder doch anders?
Von alter_stier im Forum PHPAntworten: 2Letzter Beitrag: 19.04.06, 16:25 -
ArrayList, Vector oder ....... doch ganz anders
Von phpman im Forum JavaAntworten: 4Letzter Beitrag: 24.02.05, 16:54 -
UVW Mapping oder doch anders
Von mooseport im Forum 3D Studio MaxAntworten: 5Letzter Beitrag: 14.11.04, 18:23 -
[FRAGE] Blog un Co oder doch ganz anders?
Von Freigeist im Forum HTML & XHTMLAntworten: 4Letzter Beitrag: 31.10.04, 11:29





Zitieren


Login





