Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Disskussion bzgl. der Client-Server-Komponente
Thomas B
myCSharp.de - Member



Dabei seit:
Beiträge: 223

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tt556789900
myCSharp.de - Member



Dabei seit:
Beiträge: 33

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Luth
myCSharp.de - Member



Dabei seit:
Beiträge: 36

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
tt556789900
myCSharp.de - Member



Dabei seit:
Beiträge: 33

beantworten | zitieren | melden

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

danke fuer das Example, war sehr aufschlussreich fuer mich :)
private Nachricht | Beiträge des Benutzers
tt556789900
myCSharp.de - Member



Dabei seit:
Beiträge: 33

beantworten | zitieren | melden

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);
        }
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von tt556789900 am .
private Nachricht | Beiträge des Benutzers
oliver1979
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Wird IP-Adresse benötigt ?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
da_user
myCSharp.de - Member



Dabei seit:
Beiträge: 94
Herkunft: nähe Regensburg

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers