Benutzer mit den meisten Antworten
Server nicht UI-blockierend - Ideensammlung

Frage
-
Hallo,
ich habe ein paar Fragen.
http://dzaebel.net/TcpClientServer.htm
Der Download4 öffnet Server + Client. Das ist schon mal super. Wo stellt man das genau ein?
Wie kann ich erreichen, dass der Server den Client auch später mitöffnet?
Wie kann ich erreichen, dass der Server den Client schließt? Also Benutzer klickt auf Server, Server+Client öffnet, schließt der Benutzer den Server, schließt auch der Client. Der Client kann nicht beendet werden! Somit ist sichergestellt, dass alle beide tun.
Prinzipiell ist das Beispiel doch ausreichend, oder?
@Frank, Du sagst nicht unbedingt, warum?
Ich suche einfach UI nicht blockierend.
Ist das jetzt der Thread oder das Application.DoEvents();
Oder wäre evtl. eine Klasse, die einen BackgroundWorker hat zielführender?
/// <summary> S E R V E R </summary> private void Form1_Load(object sender, EventArgs e) { IPAddress ipAdresse=null; try { this.Show(); Application.DoEvents(); GetIpAdresse(ref ipAdresse, Dns.GetHostName()); tcpListener = new TcpListener(ipAdresse, Props.Port); tcpListener.Start(); }
Kurzum, ich suche NICHT UI behindernd, Wiederverbindung des Client, bei Fehler, sonstiges.
Klasse UI hat Objekt vom Server Klasse drin, nicht den Socket in die Form, oder? von der Form abgeleitet.
Die Klasse MyFORM_S verwendet einen Server, ein Objekt ?
Die Klasse MyFORM_Client verwendet einen Client, ein Objekt ?
Übertragen nicht viel, EventNr, Inhalt1, Inhalt2, Inhalt3. Das wars. Ist eine Verschlüsselung hilfreich? Es gibt ja teils Formate
Länge - Inhalt was übertragen werden soll, sollte nicht zu kompliziert sein / aufgebohrt werden. Klein und gut, verständlich!
http://dzaebel.net/TcpClientServer.htm
Wie macht so was typisch.
Grüße Andreas
Antworten
-
Hallo Andreas,
ich habe den [Download4] ersetzt und jetzt auch berücksichtigt, dass der Server eine Neuverbindung macht, wenn der Client Socket verworfen wurde.
ciao Frank- Als Antwort markiert Andreas Bauer2 Freitag, 18. Februar 2011 05:46
Alle Antworten
-
Hallo Frank,
ok, die 2 Apps habe ich gefunden.
Ok muss man halt mal gemacht haben.
Bild
http://www1.minpic.de/bild_anzeigen.php?id=138237&key=48355547&endeBleibt die Frage für die Kundenauslieferung.
Icon auf Desktop: Start Server -> Start Client automatisch
Client durch Benutzer nicht beendbar!!
Server wird geschlossen, automatisch somit auch der Client.Für den Bediener ist es 1 Programm!!!
Läuft bei der Download03 ? Neuverbinden. Der Server hängt voll. No Responding.
Bild
http://www1.minpic.de/bild_anzeigen.php?id=138238&key=16818416&endeNeuverbindung. Client sendet
geht nicht Versuch neu zu verbinden So sehe ich es, oder?Wie müsse es aus Deiner Sicht gehen? Läuft das bei Dir?
Ich habe auf VS2008 ohne Fehler konvertiert.
Danke im Voraus.
Grüße Andreas
- Bearbeitet Andreas Bauer2 Mittwoch, 16. Februar 2011 08:07 Format Versuch 5
-
Hallo Andreas,
also ok, TcpClient für die UI nicht blockierend kann man letztlich mit den Methoden schaffen, die in meinem Artikel auch benannt sind.
Ich meine auch, dass ich den Fall eingebaut hatte, dass der Server weg ist. Für anspruchsvollere Lösungen kann man auch "Asynchrone Sockets" benutzen und ist dann bzgl. Blockierung von ein paar Dingen "befreiter".[Verwenden eines asynchronen Clientsockets]
[An Asynchronous Socket Server and Client - CodeProject]
__________________________Dennoch will ich hier klar sagen, dass Dinge, die mit Kommunikation zu tun haben heutzutage eher mit WCF abgehandelt werden sollten.
[Client server sample using WCF and net.tcp binding Articles, samples and tutorials]
http://www.dotnetspider.com/resources/19314-Client-server-sample-using-WCF-net-tcp-binding.aspxDas ginge für TCP-gebunde Kommunikation zum Beispiel über [NetTcpBinding-Klasse]
[c# - Tcp Client two way communication help - Stack Overflow]
http://stackoverflow.com/questions/1354348/tcp-client-two-way-communication-help
ciao Frank -
http://www1.minpic.de/bild_anzeigen.php?id=138239&key=72170937&ende
Hallo Frank,
OK Download4 schließt nicht fehlerfrei.
OK ich schau mal die anderen Projekte, diese sind halt etwas groß und dann auch teils nicht ganz verständlich.
Da sind Deine Projekte mit Sicherheit besser, prägnanter.Grüße Andreas
-
Hallo Andreas,
ich hatte in Erinnerung, dass eins der Projekte das berücksichtigt.
- > Da sind Deine Projekte mit Sicherheit besser, prägnanter.
ja danke, das war der Sinn, warum ich sie erstellt hatte - für einen Einstieg.
Leider sind die anderen dann etwas aufwendiger.
Allerdings habe ich sie auch schon länger nicht mehr auf den neusten Stand gebracht.
Wenn natürlich wichtige Anregungen da sind, bin ich natürlich offen, wichtige Bugs zu beheben.
ciao Frank -
Wenn natürlich wichtige Anregungen da sind, bin ich natürlich offen, wichtige Bugs zu beheben.
Hallo Frank,
ja das wäre nett. Wenn dann aber nur für VS2008 ;-) .NEt3.5
Download4 geht nicht. Arbeitet man nur mit der EXE, ohne VS2008 merkt man es nicht.
Der Download4 wäre super, nur verständlich, das ich hauptsächlich nur
- 1 Server
- 1 Client
habe
Das ganze eben asynchron gehen sollte.
Grüße Andreas
private void Execute() { Melde("Der Server ist gestartet auf Port : " + Props.Port); Melde("Der lokale Endpunkt ist :" + tcpListener.LocalEndpoint); Melde("Warte auf Verbindung eines Clients ..."); while (!this.threadStopEvent.WaitOne(0, true)) { if (tcpListener.Pending()) // *** hier ist der BUG { socket = tcpListener.AcceptSocket(); Melde("Client-Verbindung akzeptiert von: " + socket.RemoteEndPoint); new Thread(new ThreadStart(ReceiveHandler)).Start(); } } }
void Server_FormClosing(object sender, FormClosingEventArgs e) { // *** hier ist der BUG,die Ursache
// ** Warum wird das eigentlich vom Client aufgerufen? Ich finde da nichts.
if (socket != null) socket.Close(); if (tcpListener != null) tcpListener.Stop(); Environment.Exit(0); }
-
Hallo Andreas,
ich habe eben den [Download 4] aus meiner Seite noch mal auf VS 2008 ausführen lassen.
(ja, ich hatte es tatsächlich noch :-)Ich habe F5 gedrückt, dann einen Text eingegeben - Text wurde sauber im Server erkannt - dann den Server geschlossen - Text im Client eingegeben - er sagte sauber: "das keine Verbindung hergestellt wurde und versuchte alle paar Sekunden wieder eine neue Verbindung - keine Exception o.ä. - dann den Server neugestartet - dann wieder Text im Client eingegeben -> alles wieder ok und zu jeder Zeit UI-responsive.
So soll es ja eigentlich sein!
Wie kann ich Deinen erzeugten Fehler reproduzieren?Hast Du durch das SP1 von .NET 3.5 denn auch alle Servicepacks von .NET installiert (die installieren auch die SPs von .NET 2.0) ?
ciao Frank -
So soll es ja eigentlich sein!
Wie kann ich Deinen erzeugten Fehler reproduzieren?Hast Du durch das SP1 von .NET 3.5 denn auch alle Servicepacks von .NET installiert (die installieren auch die SPs von .NET 2.0) ?
Hallo Frank,
alles installiert. Ich hab's jetzt ohne Firmennetz geprüft, dann geht es auch.
Dann liegt es an dem, oder? Wenn ja, was könnte man dagegen tun?
Gruß, Andreas
-
Hallo Andreas,
ja gut, aber gemäß Deines Bildes ist es ja bei Pending das Socket Object, was ggf. disposed ist.
es ist ja aber auch eine Zeile darüber schon beschrieben:/// <summary>Momentan ungenutzt. Um ggf. den Server sauber unterbrechen zu können.</summary>
thread = new Thread(new ThreadStart(Execute)); thread.Start();
ersetzten. Dann noch folgendes ersetzen:
void Server_FormClosing(object sender, FormClosingEventArgs e) { threadStopEvent.Set(); // dem Thread signalisieren, dass er stoppen soll while (thread.IsAlive) Thread.Sleep(0); if (socket != null) socket.Close(); if (tcpListener != null) tcpListener.Stop(); Environment.Exit(0); }
Also etwa den "thread" global machen und den Start des Thread folgendermassen ersetzen:und in der while-Schleife mit dem WaitOne als erste Anweisung noch ein Thread.Sleep(0) herein.
Ich habe das jetzt mal im [Download4] ersetzt. _______________
nur so .... noch ein paar Links:
[c# - Proper way to stop TcpListener - Stack Overflow]
http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener[c# - ~1 second TcpListener Pending()/AcceptTcpClient() lag - Stack Overflow]
http://stackoverflow.com/questions/2740664/1-second-tcplistener-pending-accepttcpclient-lag
ciao Frank -
bevor man den Socket schliesst (bei Form-Closing), muss eben zunächst dafür gesorgt werden, dass der Thread nicht mehr läuft.
Also etwa den "thread" global machen und den Start des Thread folgendermassen ersetzen: ich teste es heute.Hallo Frank,
Klicke auf den Client, sende udn schließe.
Warum schließt der Client den Server. Wie hast du das gemacht? DANKE.
void Server_FormClosing(object sender, FormClosingEventArgs e) { threadStopEvent.Set(); while (thread.IsAlive) Thread.Sleep(0); if (socket != null) socket.Close(); if (tcpListener != null) tcpListener.Stop(); Environment.Exit(0); }
Grüße Andreas
- Bearbeitet Andreas Bauer2 Donnerstag, 17. Februar 2011 08:50 Format; Grund
-
thread = new Thread(new ThreadStart(Execute)); thread.Start();
Hallo Frank,
leider geht es immer noch nicht. Irgendwo ist ein Bug drin.
Thread, Buffergröße oder!?!?
Anbei das Video, dann sieshst du es, wenn mehrfach gesendet wird.
Hast Du noch eine Idee. Sonst wäre es gut, denke ich mal für meine Anwendung.
Video.
http://www.materialordner.de/Zs3EYzJ31yR98tLzZtOhVG99iMMI4JbS.html
Bild.
http://www1.minpic.de/bild_anzeigen.php?id=138304&key=30612390&ende
Oder geht es zu schnell?!?!?
Grüße Andreas
-
Hallo Andreas,
ja, geht etwas schnell, ich schau mal heut abend mal in den Code rein, ich hatte eine andere Stelle angepasst als Du jetzt getestet hattest.
ciao Frank
Hallo Frank,
vielen Dank! Passt und reicht noch.
Der Client sollte dennoch irgendwann mal auf Timeout gehen! Nach 5 Versuchen wird es nichts mehr.
Wenn es so gehen würde, wäre es super.
Grüße Andreas
~~~~
s konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 10.254.133.198:8123
Verbinde mit Server .....
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 10.254.133.198:8123
Verbinde mit Server .....
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 10.254.133.198:8123
Verbinde mit Server .....
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 10.254.133.198:8123
Verbinde mit Server .....
Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte 10.254.133.198:8123Über eine globale Variable oder über Socketexception ?
void NeuVerbinden(int waitSeconds) { // Warten mit Response-fähiger Applikation WartenUndNeuverbinden(waitSeconds); } private void WartenUndNeuverbinden(int sekunden) { new Thread(new ParameterizedThreadStart(WartenImThreadUndNeuverbinden)).Start(sekunden); } void WartenImThreadUndNeuverbinden(object sekunden) { Thread.Sleep((int)sekunden * 1000); if (formClosing) return; this.Invoke(new NeuVerbindenAufruf(this.NeuVerbinden)); }
-
Hallo Andreas,
ich habe den [Download4] ersetzt und jetzt auch berücksichtigt, dass der Server eine Neuverbindung macht, wenn der Client Socket verworfen wurde.
ciao Frank- Als Antwort markiert Andreas Bauer2 Freitag, 18. Februar 2011 05:46
-
Hallo Andreas,
ich habe den [Download4] ersetzt und jetzt auch berücksichtigt, dass der Server eine Neuverbindung macht, wenn der Client Socket verworfen wurde.
ciao Frank
Gutne Morgen Frank,super, werde es heue testen! Vielleicht noch das Serialisieren, DeSerialisieren.
Vor allem wie man so etwas dann noch für später in C++/MFC managed Code handelt.
Gruß, Andreas