Laden...

Disskussion bzgl. der Client-Server-Komponente

Erstellt von tom-essen vor 17 Jahren Letzter Beitrag vor 11 Jahren 35.926 Views
tom-essen Themenstarter:in
1.815 Beiträge seit 2005
vor 17 Jahren
Disskussion bzgl. der Client-Server-Komponente

Hallo!

Dieser Thread ist von mir als Diskussions-Ort für das folgende Tutorial gedacht:
[Tutorial] Client-/Server-Komponente über TCP-Sockets, da dort ja nur die Mods Schreibzugriff haben.

Hier also bitte alles an Anregungen oder Kritik reindonnern 🙂

Nobody is perfect. I'm sad, i'm not nobody 🙁

S
22 Beiträge seit 2006
vor 17 Jahren

ja, das ist gut... ich habe eine frage...

solch eine ähnliche programm-stuktur habe ich in einem Programm verarbeitet... allerdings dient es jetzt nur zu abfrage zwecken... ich möchte eine Funktiom einbauen, in der die user dieses programms miteinander kommunizieren können... also client-nr 4 will jetzt beispielsweise eine nachricht an client-nr 27 schicken...

  1. muss eine ID oder logindaten erkennen
  2. muss die ID mit den Clienten-nr abgleichen
  3. die nachricht an diesen clienten senden*

*hiermit habe ich bedenken, dass es funktioniert

bevor ich mich jetzt ans große programmieren mache, wollte ich wissen, ob dies möglich ist...

im prinzip benutze ich das gleiche system (mehr oder weniger), nur dass die verbindung dauerhaft ist...

wäre nett, wenn mir das jemand sagen könnte...

Sypher

96 Beiträge seit 2006
vor 17 Jahren

Hallo zusammen,

Als erstes danke für das Tutorial! Wäre froh gewsen, wäre dies schon anfang Jahr hier online gewesen aber so habe ich mich selbst wohl noch tiefer mit diesem Thema befasst.

Ich habe dein Turtorial nun (nur) überfolgen, da ich meine CS-Struktur ganz an http://www.microsoft.com/germany/msdn/library/net/csharp/NetworkingMitCSharp.mspx?mfr=true orientiere.

**Sehe ich es richtig, dass du kein Thread Array erstellst, sobald eine Verbindung eingeht? Ich glaube nämlich dies ist der Schlüssel zur Kommunikation zwischen den verschiendenen Clients wie von mir und Sypher gewollt.

Ich glaube theoretisch kann man mittels invoke zwischen den Threads hin und her springen...** Wäre froh um Bestätigung oder Korrektur.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo zusammen,

kleiner administrativer Einschub:

Im Artikelforum kann man zwar als Benutzer keinen neuen Thread erstellen, aber man kann auf einen bestehenden Thread antworten (zumindest sollte es gehen). Deshalb hätte die Diskussion auch dort stattfinden können. Da ich aber durchaus sinnvoll ist, den Artikel für sich stehen zu lassen und die Diskussion auszulagern, habe ich den Artikel selbst geschlossen.

herbivore

tom-essen Themenstarter:in
1.815 Beiträge seit 2005
vor 17 Jahren

Hallo!

Ich hol' jetzt mal ein wenig aus, um sicherzugehen, dass wir uns nicht falsch verstehen, also bitte nicht als Belehrung betrachten 😉 :

Also grundlegend ist diese Komponente nicht als Kommunikationsmöglichkeit zwischen Clients gedacht, sondern als kurzfristige Client-/Server-Kommunikation. D.h. ein Client greift kurzfristig auf Dienste eines Servers zu, kriegt evtl. noch eine Antwort, danach ist die Kommunikation beendet.

Was Vido und sypher ansprechen, ist eher eine Peer-to-Peer-Verbindung, ähnlich den Tauschbörsen oder Chat-Programmen, wo es nicht zwingend einen zentralen Server gibt, höchstens einige Knoten, welche die Verbindungen einleiten, sonst aber den Clients funktional "unterlegen" sind.

Bzgl. dieser Kommunikation und einer längerfristigen Client-/Server-Kommunikation, d.h. z.B. kein automatischer Abbau oder ein wesentlich höherer TimeOut-Wert habe ich als nächstes geplant, entweder als neues Tutorial oder als Fortsetzung zum o.g. Tutorial.

Nobody is perfect. I'm sad, i'm not nobody 🙁

96 Beiträge seit 2006
vor 17 Jahren

Hi tom

Was Vido und sypher ansprechen, ist eher eine Peer-to-Peer-Verbindung, ähnlich den Tauschbörsen oder Chat-Programmen, wo es nicht zwingend einen zentralen Server gibt, höchstens einige Knoten, welche die Verbindungen einleiten, sonst aber den Clients funktional "unterlegen" sind.

Nein ich spreche keine Peer-to-Peer Verbindung an. Ich möchte tatsächlich zwischen den Clients kommunizieren ohne, dass die miteinander direkt Verbunden sind. Ich habe dies nun realisiert und werde mitte Juli selbst ein kleines Turtorial dazu veröffentlichen.

Hier eine kleines Preview:


// Erstelle ein Array in dem die Verbindung erstellt werden
private static ArrayList threads = new ArrayList();

// Neuen Client IM Array instanzieren. Dabei übergebe ich den TCPClient
threads.Add(new InClient(c));


// Das kommunizieren zwischen den Clients läuft in einer Schleife ab:
 foreach (InClient inclient in threads)
{
       inclient.sende_nachricht("hallo");
}

Selbstverständlich ist dies nur die Grundlage! Man muss noch mit Abfragen ob es der richtige Client ist, etc...

S
22 Beiträge seit 2006
vor 17 Jahren

ahh, evt. hilft mir das schon weiter...
ich tüftel mal nen bissle...

wenn nicht, dann freue ich mich schon auf das tutorial...

danke für eure hilfen!

Sypher

S
8.746 Beiträge seit 2005
vor 17 Jahren

Mein Tipp: Das ist von den Anforderung de facto identisch mit einem klassischen Multi-User-Chat. Und Netzwerk-Chats in .NET gibts wie Sand am Meer.... muss man nur nach googeln.

Bei "härteren" MU-Games müßte man sich schon eher um Performance (vielleicht UDP anstelle von TCP) Gedanken machen. High-Level-Protokolle wie WebServices würden dann auch ausscheiden.

Welche Technologie man in diesem Szenario einsetzt ist fast Wurscht. Gehen tut alles. Es ist nur ein Frage der Plattform und vielleicht der Sicherheit (Durchdringung von Firmen-Firewalls).

Die vermutlich einfachste Implementierung wäre über Remoting. Für den Rückkanal bieten sich dann Events (eine Nachricht an alle wie bei Chat) bzw. Delegates (gezielte Benachrichtigung eines Clients) an.

T
38 Beiträge seit 2006
vor 17 Jahren
läuft nicht stabil

Hallo,

ich habe die Komponente ausprobiert.
Das Senden der kleinen Nachricht scheint einwandfrei zu funktionieren.

Leider bekomme ich immer beim Senden der großen Message einen Übertragungsfehler. Nach dem Übertragungsfehler hängt die Komponente und läßt sich nur noch abschiessen.

Gibt es mittlerweile eine aktualisierte Version bzw. was könnte bei mir falsch laufen? (Ich probiere Client und Server direkt auf dem gleichen Rechner (per 127.0.0.1)) Von 10x funktioniert die große Nachricht 1x und 9x nicht.

Gruß
Torsten

There are 10 diffent types of people in this world: Those who understand binary and those who don't....

3.728 Beiträge seit 2005
vor 17 Jahren
Sicherheit

Wie sieht es denn mit Sicherheit aus? Remoting bietet z.B. Windows-Authentifizierung über SSPI an.

Wie kann ich die Identität des Client-Benutzers am Server überprüfen?

I
7 Beiträge seit 2004
vor 17 Jahren
Abort?

Hallo,

hab das mal ausprobiert und für gut befunden 😉
nein, finde es echt klasse, auch die Idee die dahinter steckt. jedoch kann ich die ServerGui nicht beenden, die Form schloss sich zwar aber der prozess (insgesamt 3 Threads) wurde nicht beendet.

kennt ihr das Problem?

MfG
ice

MfG ice

tom-essen Themenstarter:in
1.815 Beiträge seit 2005
vor 17 Jahren

Hallo!

Also:
Bzgl. der grossen Nachrichten werd' ich dass demnächst nochmal überprüfen, hab' allerdings grad' noch ein paar Prüfungen.
Wie gross sind den die Daten? Ich hatte es mal mit 2MB probiert, da hat's funktioniert.
Aber wenn's nicht funktioniert, weis ich evtl. schon, woran es liegt: Die Daten müssen fragmentiert werden, da die Socket-API nur einen begrenzten Puffer hat ( ich glaub' 16KB ). Leider hab' ich keine Möglichkeit gefunden, diesen Wert abzufragen.
D.h. liegt der Fehler wahrscheinlich beim Senden der Nachricht.
Aber wie gesagt: Ich prüfe das ....

Bzgl. der "Unmöglichkeit", die ServerGui zu schliessen, liegt dies einfach nur daran, dass die Threads für die Client-Verbindungen nicht beendet werden.
Dies muss man explizit durchführen, wobei ich da mittlerweile ein wenig verändert habe.
Ich werd' auch dass nochmal neu ausarbeiten, und dann das vorhandene Tut. erweitern.

Aber vergebt mir, wenn ich mich bei dem Wetter nicht ganz so beeile 😉

Nobody is perfect. I'm sad, i'm not nobody 🙁

56 Beiträge seit 2006
vor 17 Jahren

Ich freue mich schon auf das erweiterte TUT 😉.
😁

//Edit

Interessant fände ich z.B. wie ich größere, binäre Datein verschicke (mehrere hintereineander) und die Gegenstelle diese ordnungsgemäss empfängt und speichert 😉.

Ich habe einfach mal folgendes probiert :


if (mem.Length>0)
				{
					if (mem.Length==4)
						if (System.Text.Encoding.ASCII.GetString(mem.ToArray(),0,4)=="quit")
						{
							instanceOfClass.closeConnection();
							break;
						}
					//Console.WriteLine("send {0} bytes",mem.Length);
					instanceOfClass.Receive(mem.ToArray());

                    // Von mir------------------------------------
                    image = Image.FromStream(mem);
                    image.Save(@"F:\TESTBILD.jpg"); //ca 2,5MB
                    // Von mir ENDE ------------------------------

					mem.Seek(0,SeekOrigin.Begin);
					mem.SetLength(0);
					TimeOut=0;
				} 

und auf client Seite :



 private void SendeBild_Click(object sender, EventArgs e)
        {
            MemoryStream mem = new MemoryStream();
            BilderBox1.Image.Save(mem,ImageFormat.Jpeg );
            byte[] rawData = mem.ToArray();
            client.send(rawData);
        }


Das Bild kommt nur teilweise an 😭.

Wie kann man sowas ralisieren ?

Später sollen dann auf Client seite in einer Schleife mehrere Bilde hintereinander geschickt werden.

Wie halte ich die Streams auseinander ?
In einem Buffer, der gesendet wird kann doch auch mal das Ende des Einen Bildes und der Anfang des nächsten Bildes sein oder sehe ich da was falsch ?

Habe mal irgend was aufgeschnappt, das man dann erst die Größe schickt und dann
den Stream.

Dann schicke ich die Größe meinetwegen '20000000' , danach das Bild , so jetzt kommt ein Buffer an , wo 20000000 drinn steht und danach die Bildinformation wie weiss ich wie weit meine Größe in dem Buffer geht ?

Baue ich mir selber Trennzeichen ein ?
Mache ich auf Client Seite eine Pause, damit ich in den Timeout vom Server laufe ?

Danke

Ylirebus

Die Bugs verhalten sich proportional zu den Codezeilen und nehmen exponential zu.(Ich bin nicht doof, ich denke nur anders. 😉)
Ich fühle mich als wäre ich diagonal in einem Paralleluniversum abgestellt worden.

R
6 Beiträge seit 2007
vor 17 Jahren

Hallo, erstmal vielen Dank für das tolle Tutorium.

Ich hab allerdings eine Frage, bzw. ein Problem auf der Server-Seite. Das der Server in einer Schleife auf eingehende Client-Verbindungen warten muß, ist mir klar. Und das man das ohne das Programm zu blockieren in einem Thread durchführen sollte, ist auch verständlich. Ich bin nur über folgende Codezeilen verwundert:


       listener.Start();
        // Solange Clients akzeptieren, bis das 
        // angegebene Maximum erreicht ist
       while (true)
        {
            while (!listener.Pending()) {Thread.Sleep(sleepTime);}
            Socket newSocket = listener.AcceptSocket();
            if (newSocket != null)
            {
                // Mitteilung bzgl. neuer Clientverbindung
                System.Console.WriteLine("Neue Client-Verbindung ("+
                    "IP: "+newSocket.RemoteEndPoint+", "+
                    "Port "+((IPEndPoint)newSocket.LocalEndPoint).Port.ToString()+")");
                serverInstance newConnection = new serverInstance(newSocket);
                Clients.Add(newConnection);
            }
        }

Das abhören geschieht über eine while(true) Schleife, ohne Abbruchbedingung (dafür allein sollte man doch jemanden steinigen, oder??). Und daher resultiert mein Problem. Beim Schließen meines Programms läuft offensichtlich diese Schleife weiter (ich hab im Taskmanager gesehen, dass der Prozess beim beenden des Programms nicht geschlossen wird). Der zugehörige Thread geht in den Status WaitJoinSleep (ohne Gewähr). Bau ich Testweise eine Abbruchbedingung in die Schleife ein, wird alles ordnungsgemäß beendet.
zb.


 listener.Start();
        // Solange Clients akzeptieren, bis das 
        // angegebene Maximum erreicht ist
       int counter = 0;
       while (counter<5)
        {
            while (!listener.Pending()) {Thread.Sleep(sleepTime);}
            Socket newSocket = listener.AcceptSocket();
            if (newSocket != null)
            {
                // Mitteilung bzgl. neuer Clientverbindung
                System.Console.WriteLine("Neue Client-Verbindung ("+
                    "IP: "+newSocket.RemoteEndPoint+", "+
                    "Port "+((IPEndPoint)newSocket.LocalEndPoint).Port.ToString()+")");
                serverInstance newConnection = new serverInstance(newSocket);
                Clients.Add(newConnection);
                counter++;
            }
        }


Diese Bedingung beendet die while Schleife wenn 5 Clients sich angemeldet haben. Aber das ist ja nicht Sinn des Servers.
Also wie sollte man sauber diesen Thread /Schleife verlassen? Ruf ich Thread.Abort() auf, wechselt der Status in WaitSleepJoin / Abort Requested.... und nix passiert.

Taner

S
8.746 Beiträge seit 2005
vor 17 Jahren

Entweder du schiesst den Thread per Abort() ab, oder du definierst ihn als Background-Thread, dann macht das .NET automatisch bei App-Ende. Eine simple Abbruchbedingung im While reicht jedenfalls nicht, weil AcceptSocket()-Socket ja blockiert. Die Beendigung des Threads würde also nur dann Eintreten, wenn sich ein neuer Client verbunden hat. Dritte Möglichkeit ist BeginAcceptSocket in Kombination mit einem Sync-Objekt, welches den Abbruch signalisiert.

R
6 Beiträge seit 2007
vor 17 Jahren

Danke für die Antwort. Also ein paar Möglichkeiten hast du mir ja jetzt aufgezählt. Allerdings frag ich mich, wieso das im Tutorial nicht erwähnt, oder dann anders gemacht wurde.

Gruß, Taner

PS: Der Fehler lag bei meinem Code ..., und ich will dem Autor des Tutorial auch nix vorwerfen 🙂 Ich freu mich über jedes gut geschriebenes Tutorial.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Der freundliche Mensch, der das Tutorial geschrieben hat, wird sich sicher über Verbesserungsvorschläge freuen.

J
4 Beiträge seit 2007
vor 16 Jahren
Problem: auf Win CE 4.2 mit CF 1.0 SP3

hi!

ich sitz hier verzweifelter art und weise an ner client-server-anwendung:
ein gerät ist ein normaler pc und dazu kommt noch ein pda mit nem windows ce 4.2 dotNet (CF 1.0 SP3 soweit ich weiß).
(btw: ich habe schon mehrere erfolgreiche anwendungen für dieses gerät geschrieben...bin also nicht grad n newbee in der materie)
ich habe das beispiel hier ausm forum erfolgreich auf dem pc compiliert und ausprobiert.
ich kann auch ohne probleme server und client auf dem pda laufen lassen.
ABER:
sobald ich vom pda (client) auf den server (pc) zugreifen will, kommt ne socketexception geflogen. (hab auch schon andere socket-examples ausprobiert)

firewalls ist aus. geräte können sich untereinander anpingen. WAS MACH ICH FALSCH??? so langsam verlier ich jegliches vertrauen in mich selbst möööp

ich bin über alle hinweise sehr dankbar!

mfg, der tobi

[edit]
wenn der server auf dem pda läuft, dann kann ich mich connecten!!! ist da irgendwas auf dem pda, was nen verbindungsaufbau nach außen verhindert?
mit dem internet-explorer (aufm pda) kann ich auf den pc zugreifen.
wenn die client-server-anwednung über port 80 geht, funktioniert's trotzdem nicht.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Über welche Strecke gehst du? ActiveSync, WLAN, Bluetooth?

J
4 Beiträge seit 2007
vor 16 Jahren

oh sry...ganz vergessen: es ist ne wlan verbindung.
kann es denn daran liegen? weil die geräte sich ja anpingen können.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Gabs da nicht was mit Work, Internet noch was anderes in den Netzwerkeinstellungen von Pocket PC? Schraub doch da mal rum. Ansonsten riecht das normalerweise sehr nach Firewall.

J
4 Beiträge seit 2007
vor 16 Jahren

ich bin auch erst von firewall ausgegangen, aber da ist echt nichts am laufen.
-->mit iexplorer (auf pda) zum pc geht irgendwas (der server checkt was), aber mit der client anwendung aufm pda zu serverport 80 aufm pc geht nix.

ich erschieß mich heut noch mööp

[edit]
die sache läuft immernoch nicht...
es MUSS an der .Net Socket geschichte für das compact framework liegen. was anderes kann ich mir nicht erklären. firewall ist deshalb quatsch weil ja socketverbindungen vom iexplorer (auf pda) aus funktionieren und nur nicht mit meinem programm bzw. der testanwendung hier ausm forum. außerdem kann ich mich wenn der pda server ist auch zu ihm connecten.
ich probier morgen mal das CF 2.0 aus...wenn's denn auf CE 4.2 läuft...da hab ich noch keinen plan.

[nochma_edit]
java sockets laufen!!! es is echt 100% die Socket geschichte vom .Net CF!

Gelöschter Account
vor 16 Jahren

hallo

bei mir funktioniert das garnicht (ich benutzte die version von tom-essen)
hab beide programme auf dem gleichen pc laufen
der Server läuft in der Schleife vor sich hin
aber der client bleibt in der Connect methode hängen und gibt nach etwa 4 sek eine ausnahme raus.
firewall kanns nicht sein (hab keine)
vllt ist es windows schuld (diese version hat des-öfteren macken, vorallem wenn es um netzwerk dinge geht)

ich werd mal an nem anderen PC gugen ob es da läuft

aber vllt kennt einer das problem und weiß abhilfe

MfG janismac

EDIT:

habs mal an nem anderen PC ausprobiet, klappt auch nicht
was ist falsch????

tom-essen Themenstarter:in
1.815 Beiträge seit 2005
vor 16 Jahren
Client/Server-Komponente

Hallo!

Da ich z.Zt. an einem Projekt arbeite, welches die C/S-Komponente verwendet, werd' ich mal versuchen, das Tutorial und die Komponente ein wenig zu überarbeiten und zu erweitern.
Kann allerdings etwas dauern, bin im schreiben nicht unbedingt der Fleißigste ...

Nobody is perfect. I'm sad, i'm not nobody 🙁

K
165 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich glaube ich bin doch ein wenig dämlich X(.

Ich hab mir das Tutoiral heruntergeladen, und wollte anfangs eigentlich nichts anderes machen als auf der ServerGui, in einer richTextBox, alle vorgänge "mitloggen" zu lassen.

Ich dachte eigentlich das ich das "ganz einfach" über


server = new Server(typeof(ServerGui.server_class));
server.status.messageEvents += new MessageEvent(status_messageEvents);

realisieren kann, allerdings seh ich in der rtb dann nur den Namespace namen "Server.Gui" 🤔.

Kann mir jemand vielleicht auf die Sprüngen helfen?

Gruß Kalleberlin

If u want to finish first, u have to finish first.
S
89 Beiträge seit 2007
vor 16 Jahren

Hey.
Also ich finde das Tutorial ist echt spitze 👍

Allerdings hakt es bei mir an dieser Stelle:


public Server(Type serverClass)
{
    Type it = typeof(serverInterface);
    // Zentralen Eventhandler registrieren
    status.messageEvents+= new MessageEvent(Server_MessageEvents);
    ...

Mein Problem ist, das ich bei status.message... nicht finde, wo status deklariert ist.
Ich finde auch nichts, was damit zu tun haben könnte.

Danke schon einmal im voraus.
Gruß Speedy_92

K
9 Beiträge seit 2006
vor 16 Jahren

Und ich bekomme folgende Fehlermeldung beim ausführen unter VS2008:

System.InvalidOperationException was unhandled
Message="Das Protokoll für die Quelle TcpServer kann nicht geöffnet werden. Möglicherweise haben Sie keinen Schreibzugriff."
Source="System"

Habe nichts verändert.
Wäre es möglich dass jemand das Tutorial für die Verhältnisse und Neuerungen in VS2008 und dem FW3.5 anpasst?

Danke schonmal.

S
120 Beiträge seit 2005
vor 16 Jahren

Hm, sehr nettes Tutorial. Funktioniert auch super! Nur ein Problem habe ich, wie entferne ich eine ServerInstanz aus dem "clients"-Array wenn der client die Verbindung trennt? Jetzt bekomm ich eine nullpointer exception.

thx SunboX

Actionscript ist die Möglichkeit, postmaterielles Basteln zum Lebensstil zu machen.

Künstliche Intelligenz ist leichter zu ertragen, als natürliche Dummheit!

W
16 Beiträge seit 2008
vor 16 Jahren

Hallo an alle

ich bin neu in myCSharp.de, auch beschäftige ich mich seit kurzem mit C#. Und schon muss ich mich mit TCP Socket verbindung vertraut machen. Nun habe ich dieses Tutorial entdeckt, welches mir sehr viel verständlich gemacht hat. Leider muss ich sagen, dass der Quellcode, der dabei ist, nicht in VS 2005 compilieren lässt, und somit nicht lauffähig ist. Meine Bitte an Diejenigen, könnte mir jemand Quellcode Version für .Net 2005 zukommen lassen.

Ich habe es soweit in .Net 2005 konvertieren können, bloß der Server lässt sich nicht starten auch kann ich den Client mit Server nicht verbinden.

Gruß

M
9 Beiträge seit 2008
vor 15 Jahren

Hast du die IP Adresse geändert? 🙂

Gibt es mittlerweile eine neuer Tutorial für das Studio 2005.. oder einfach eine neue Struktur, ist ja doch ganz schön alt das Ding!


MkG Mitch
www.michaelpalmer.de

T
223 Beiträge seit 2006
vor 15 Jahren

Hallo,

Ich versuche anhand des Tutorials einen kleinen Chatserver und einen Chatclient zu erstellen. Jedoch bekomme ich an der Stelle Probleme, wo die Socketverbindung an das Objekt serverInstance übergeben wird und dann in einer Collection gespeichert wird.

Bei mir führt das Übergeben an die ArrayList zu einem Verbindungsfehler.


private void Listen()
        {
            TcpListener L = new TcpListener(this.mIpAddress, this.mPort);
            try
            {
                L.Start();
                while (!L.Pending())
                    Thread.Sleep(100);
                Client C = new Client(L.AcceptSocket());
                this.mClients.Add(C);
                this.OnSendMessage("Console: Client connected, IP: " + C.Connection.Socket.RemoteEndPoint + ", Port: " + ((IPEndPoint)C.Connection.Socket.LocalEndPoint).Port.ToString());
            }
            catch (Exception e)
            {
                throw new Exception("Fehler bei Verbindungserkennung", e);
            }

Meine ArrayList heißt mClients und beim Übergeben des Objekts Client (C) wird der Fehler ausgelöst der unten geworfen wird. Ohne die Collection funktioniert es wunderbar.

Hier noch die Client und Connection Klasse.


// Client
class Client
    {
        private Connection mConnection;

        public Connection Connection
        {
            get { return this.mConnection; }
        }

        public Client(Socket pSocket)
        {
            this.mConnection = new Connection(pSocket);
        }
    }

// Connection
class Connection
    {
        private Socket mSocket;

        public Socket Socket
        {
            get { return this.mSocket; }
        }

        public Connection(Socket pSocket)
        {
            this.mSocket = pSocket;
        }
    }

Gruß Thomas

€: Ich habe den Fehler gefunden. Ich habe vergessen die ArrayList zu initialisieren...Schade, dass die Exception die eigentliche Fehlermeldung auf einen fehlenden Objektverweis überspielt.

Gruß Thomas

T
33 Beiträge seit 2008
vor 15 Jahren

Gutes Tutorial, ich selbst hab in C++ schon mal ein lauffaehiges Programm geschrieben, allerdings eher recht zu simpel und ohne jegliches Hintergrundwissen...

Deswegen hab ich auch diese, ich glaub sehr dumme Frage ^^'


		/// <summary>
		/// Interner Event-Handler für alle Server-Meldungen, welche in die 
		/// Ereignisüberwachung des aktuellen Systems geschrieben werden.
		/// </summary>
		/// <param name="Message">Die Mitteilung</param>
		private void Server_MessageEvents(string Message)
		{
			Log.WriteEntry(Message);
		}

ich bekomm bei Log.WriteEntry(Message); eine Exceoption:
System.Security.SecurityException was unhandled
Message="The source was not found, but some or all event logs could not be searched. Inaccessible logs: Security."

Was mach ich falsch ? Ich hab das Projekt nicht veraendert. Liegt es vll daran, dass ich nicht Administrator auf dem Rechner bin?

Danke schonmal fuer die Hilfe

L
36 Beiträge seit 2006
vor 15 Jahren

Was mach ich falsch ?

Wahrscheinlich nichts. 😁

Ich hab den Tutorial-Code vor 3-4 Tagen selber mal ausprobiert und bekam die gleiche Nachricht. Ich rate jetzt einfach mal mit, das mit den neueren Frameworks oder Vista, irgendwelche neuen Sicherheitsbestimmungen zuschlagen. Nachdem ich zu blöd / faul war rauszufinden an was es lag, hab ich einfach statt dem angegebenen Log mein eigenes, auf Textdateien basierendes Log verwendet oder in die Console geschrieben. Das ging dann auch anstandslos.

Wenn du nicht unbedingt in die Ereignisüberwachung reinschreiben willst, schmeiß es einfach raus und schreib woanders rein.

Und an tom-essen nochmal ein Dankeschön für's zur Verfügung stellen des Tutorials.

T
33 Beiträge seit 2008
vor 15 Jahren

Hab die Log.WriteEntry(Message); durch meine eigene Ausgabe ersetzt, funktionert auch...

danke fuer das Example, war sehr aufschlussreich fuer mich 😃

T
33 Beiträge seit 2008
vor 15 Jahren

ich hab noch eine kleine Frage, wie kann ich von der Form aus, auf die Server_class.cs zugreifen und die Nachrichten vom Server empfangen ? Da ja die Klasse von ServerInstance in Server.cs aufgerufen wird, habe ich zwei unterschiedliche Instanzen wenn ich Server_class.cs in der Form deklariere und in einer Interface Klasse, kann ich ja keine statischen Variablen benutzen, bzw ein Event, da es von einem anderen Thread ausgeht...

wie komm ich trotzdem an die Daten heran? Danke fuer die hilfe vorab schon mal!

[EDIT]Hab das Problem nun teilweise, bzw notduerftig geloest indem ich bei serverinstance ein Event erstellt hab, das ich in Server aufruf und damit status.newMessage befuettere...


						serverInstance newConnection = new serverInstance(newSocket,x);
                        newConnection.messageEvents += new MessageEvent(newConnection_messageEvents);
						Clients.Add(newConnection);
        void newConnection_messageEvents(string Message)
        {
            status.newMessage(Message);
        }
O
77 Beiträge seit 2009
vor 14 Jahren
Wird IP-Adresse benötigt ?

Hallo Zusammen,

ich versuche gerade eine Kommunikation zwischen einer C# GUI und einem C Programm über Sockets herzustellen. Das ganze passiert auf dem gleichen PC.

Eine Grundlegende Frage wäre: Brauche ich dazu die IP-Adresse oder kann ich das direkt über den Port machen ?

Gesendet werden sollen Messdaten (2 Arrays) und Einstellungen (Einzelne Variablen). Was ist hierfür geeigneter ? TCP oder UDP ?

Ich hab mich hierzu schon teilweise eingelesen oder informiert, aber bin mir da nicht wirklich sicher. Wie lange werde ich für so etwas brauchen ? Ist das kompliziert ?

Grüße und Danke für die Hilfen
Oliver

D
94 Beiträge seit 2008
vor 11 Jahren

Hi,

ich kram dieses wohl relativ alte Thema wieder raus, da ich diese Client-Server-Komponente entdeckt und verwenden möchte.

Der Clientteil hat mich (zumindest bis jetzt) vor keine großen Herausforderungen gestellt, allerdings der Serverteil.

Hier ist ja auch der Teil in der ServerGUI relativ dürftig, besteht eigentlich nur aus der Zeile:


server = new Server(typeof(ServerGUI.server_class));

Jetzt scheiterts schonmal daran, dass ich nicht weiß, was ich nach typeof eintippen soll, denn


typeof(MeinProgramm.server_class)

gibt es nicht.

Auch frage ich mich, wie ich mit der Serverkomponente kommunizieren soll? Also wie bekomme ich mit, wenn eine neue Nachricht vom Clienten eingegangen ist, wie komme ich an diese und wie antworte ich dem Clienten dann?

Vielleicht kann mir ja der eine oder andere auf die Sprünge helfen. Mir würde evtl. sogar einfach schonmal der Quellcode zu einem Progrämmchen reichen, das einfach etwas mehr bietet als die ServerGUI, zum spicken halt 😉

VG
Matthias