Hallo zusammen,
eine grundlegende Frage zu C# und Kommunikation übers Netzwerk mit
Sockets:
Wenn der Server eine Verbindung akzeptiert hat und die Verbindung
aufgebaut ist, wie wird das Empfangen der Daten gehaldelt? Muss man das
Ankommen von Daten explizit programmieren und sozusagen immer abfragen
ob was da ist? Oder wird von selbst eine Systemfunktion ausgelöst, falls
etwas ankommt?
Danke für Eure Hilfe.
es geht beides.
Man kann einfach ein Read machen, das blockiert bis irgendwann daten
kommen oder der Timeout anschlägt. Oder man kann ein Event hinterlegen
was aufgerufen wird wenn daten angekommen sind.
Direkt über Socket, TcpClient, UdpClient oder WebRequest, WebResponse,
HttpRequest (ab 4.5 auch HttpClient) je nach dem was gebraucht
wird/selbst implementiert werden soll.
Peter II schrieb:> Oder man kann ein Event hinterlegen>> was aufgerufen wird wenn daten angekommen sind.
wie macht man das? Ich hätte jetzt eigentlich erwartet, dass ein
bestimmtes Event für das Ankommen der Daten schon hinterlegt ist, das
wiederrum eine Methode ausführen lässt, die man am Ende dann selbst
ergänzen muss..
Ralf schrieb:> wie macht man das? Ich hätte jetzt eigentlich erwartet, dass ein> bestimmtes Event für das Ankommen der Daten schon hinterlegt ist, das> wiederrum eine Methode ausführen lässt, die man am Ende dann selbst> ergänzen muss..
du solltest eventuell erstmal die grundlagen von c# lernen. Eine Methode
wird dort als eventhandler eingetragen.
Mir gehts erstmal jetzt darum, wie man ein Event hinterlegt, der
ausgelöst wird, wenn Daten ankommen. Also es geht mir wirklich um den
Anfang wie alles losgeht.
Mir ist nicht klar, wie man ein Event genau dem Ankommen von Daten
zuordnen kann.
Ralf schrieb:> Also es geht mir wirklich um den> Anfang wie alles losgeht.
dann must die MS fragen, man nimmt einfach eine methode und hinterlegt
sie als eventhandler und gut ist. Das ist die schnittstelle die man
wissen muss mehr nicht.
Peter II schrieb:> Ralf schrieb:>> Also es geht mir wirklich um den>> Anfang wie alles losgeht.>> dann must die MS fragen, man nimmt einfach eine methode und hinterlegt> sie als eventhandler und gut ist. Das ist die schnittstelle die man> wissen muss mehr nicht.
Beim TcpClient muss man schon etwas mehr tun. Grob umrissen: Nach der
erfolgreichen Verbindung geht's über den Socket mit BeginReceive und
einem AsyncCallback.
Beispiele sollte man damit finden können.
Arc Net schrieb:> Nach der>> erfolgreichen Verbindung geht's über den Socket mit BeginReceive und
Läuft die BeginReceive-Methode automatisch an?
Nochmal zu meinem Verständnisproblem: Es hieß ja, ich muss nich pollen,
ob Daten ankommen sondern es geht auch über Events.
Also wird ein Event ausgelöst, wenn Daten ankommen. Demnach muss ja
schon ein Event genau diesem Verhalten (Daten kommen an) zugeordnet sein
und ich muss den nur aktivieren oder so. Oder ich muss selber ein Event
hinterlegen, muss aber diesen zuordnen können. Denn der soll auslösen,
wenn Daten ankommen und nicht wenn ich PC runterschmeiße oder so.
Ich verdeutliche das ganze jetzt mit Buttons. Damit ist es einfacher.
Button1.Click += new EventHandler(this.GreetingBtn_Click);
Hier heißt das Event, dass der Button gedrück wurde einfach Click. Den
habe ich nicht selber erfunden, sondern der heißt wirklich so :). Und
wenn der Button geklickt wird, wird Event ausgelöst und bearbeitet durch
GreetingBtn_Click. Wie ist es jetzt mit Daten empfangen über TCP.
Socket.DatenKommenAn += new EventHandler(this.KümmerdichumDaten): ????
Welches Event wird ausgelöst wenn Daten ankommen? Mir gehts inzwischen
nicht mehr um C# sondern einfach ums Verständnis.
ich denke ich habs vielleich verstanden.
Wenn ich eine Verbindung hergestellt habe, dann kann ich die
BeginReceive-Methode aufrufen, der man wie Arc Net schon geschrieben
hat, eine AsyncCallBack übergibt. Und der ist anscheinend aktiv, bis ich
EndReceive aufrufe. Also ist meine asynchr. Handler-Methode aktiv
zwischen den Aufrufen obiger Methoden, und sobald Daten ankommen, wird
sie aufgerufen. Da kann ich dann die weitere Verarbeitung vornehmen,
weitere Events schmeißen, EndReceive aufrufen usw.
Wonach ich gesucht habe, ware ein Event wie OnReceive. Aber sowas gibts
anscheinend nicht.
Stimmt das wenigstens??? :)
Ralf schrieb:> ich denke ich habs vielleich verstanden.> Wenn ich eine Verbindung hergestellt habe, dann kann ich die> BeginReceive-Methode aufrufen, der man wie Arc Net schon geschrieben> hat, eine AsyncCallBack übergibt. Und der ist anscheinend aktiv, bis ich> EndReceive aufrufe. Also ist meine asynchr. Handler-Methode aktiv> zwischen den Aufrufen obiger Methoden, und sobald Daten ankommen, wird> sie aufgerufen. Da kann ich dann die weitere Verarbeitung vornehmen,> weitere Events schmeißen, EndReceive aufrufen usw.> Wonach ich gesucht habe, ware ein Event wie OnReceive. Aber sowas gibts> anscheinend nicht.
Den könnte man selber schreiben..
> Stimmt das wenigstens??? :)
Ja
http://robjdavey.wordpress.com/2011/07/29/improved-asynchronous-tcp-client-example/