Laden...

Sockets + Chatfenster = Freeze

Erstellt von bonzy vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.667 Views
bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren
Sockets + Chatfenster = Freeze

Tag zusammen,

mein Problem beschreibt der Titel schon ganz gut. Ich verbinde mich über Sockets (bisher nur übers Lokale Netzwerk) mit einem anderen Rechner. Die Verbindung steht und ich will nun für beide ein Chatfenster öffnen, um Nachrichten auszutauschen.

Die entsprechende Form kann ich beim "Client" problemlos öffnen, beim "Server" jedoch hängt sie sich nach Show() auf (das Hauptfenster bleibt zugänglich). Ich übergebe dabei vorher die Verbindung und ein paar Daten zum verbundenen Partner. Mein Verdacht ist, dass es hakt, weil ich die Verbindung sprich die Sockets mit übergebe, jedoch hängt sich das Fenster auch auf, wenn ich dieses ohne Parameter starte.

Gerade habe ich es einmal mit ShowDialog() probiert und schon ging es. Allerdings würde mich schon noch interessieren, wieso es in diesem Fall nicht mit Show() geht. Zumal mir trotz ShowDialog() der Zugriff auf mein Hauptfenster auch noch gewährt bleibt.

Mir wäres lieber, wenn ich den Code nicht vollständig veröffentlichen müsste, deshalb bitte gezielt nach Stellen fragen. 😉

Danke

3.728 Beiträge seit 2005
vor 13 Jahren
Warum zu Fuß

Hallo bonzy,

warum programmierst Du die Kommunikation zu Fuß mit Sockets? Das geht mit WCF oder Remoting viel einfacher. Diese Frameworks nehmen Dir fast die ganze Arbeit der Netzwerkkommunikation ab.

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Hallo Rainbird,

es gilt hauptsächlich der Übung und des Verständnisses. Einfacher geht es quasi immer, aber warum nicht mal zu Fuß sowas machen, um es wirklich verstanden zu haben. Außerdem bin ich schon zu weit, um jetzt "aufgeben" zu wollen.

Edit: Btw. habe ich noch eine kurze Frage zum Thema Sockets. Und zwar läuft der Austausch nicht wirklich, da ich nur von Server zu Client, aber nicht von Client zu Server Daten senden kann. Beim EndPoint des Clients ist der Port angegeben, über den ich kommunizieren will, beim Server jedoch steht ein anscheinend zufälliger Port. Ich nehme an, dass das der Grund ist, aber wieso ist das so, wenn ich die Verbindung doch auch über diesen Port aufbaue? Der Socket, der bei EndAccept() entspringt hat plötzlich diesen anderen Port.

3.728 Beiträge seit 2005
vor 13 Jahren
Sockets

Hallo bonzy,

ohne Code kann ich Dir nicht direkt weiterhelfen. Hier findest Du eine fertige Chat-Anwendung in C#, die mit Sockets implementiert ist: http://www.codeproject.com/KB/IP/TCPIPChat.aspx

Das sollte also ähnlich sein, wie in Deiner Anwendung. Vielleicht erkennst Du den Fehler, wenn Du Deinen Code damit vergleichst.

Wichtig! Wenn Du Netzwerkanwendung entwickeln willst, solltest Du gut über die Funktionsweise von Netzwerken und insbesondere des TCP/IP Protokolls Bescheid wissen. Dazu ist folgender Linj interessant: http://www.elektronik-kompendium.de/sites/net/0812271.htm

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Hallo Rainbird,

danke schonmal für die Links. Ich habe mich in den Programmen ein wenig umgeschaut und zumindest scheint das oben angesprochene Problem mit den Ports nicht schlimm zu sein, es ist dort nämlich genauso.

Jedoch ist die Methode der Übertragung ein wenig anders, außerdem wird ein wirklicher Server verwendet. Ich will allerdings eine P2P-Verbindung aufbauen und keinen Chatroom.

Edit: Es funktioniert jetzt soweit, allerdings immernoch nur mit ShowDialog(). Mein Hauptfenster scheint dadurch zwar nicht blockiert zu werden, was mich ein wenig sehr verwundert, aber es klappt zumindest.

U
1.688 Beiträge seit 2007
vor 13 Jahren

Hallo,

klingt danach, als würdest Du Fenster aus asynchron laufenden Threads öffnen.

[FAQ] Warum blockiert mein GUI?
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Statt uns "gezielt nach Stellen" fragen zu lassen, solltest Du die relevanten Stellen selber finden und entsprechend gekürzt zeigen. Wenn es z. B. Probleme beim Show gibt, warum zeigst Du dann nicht diesen Aufruf und das Drumherum?

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

So, da bin ich nochmal.

Es läuft jetzt alles mehr oder weniger rund. Allerdings stört es mich immernoch, dass meine komplette GUI einfriert, sobald ich in einer mit einem neuen Thread gestarteten Klasse (Connection) ein Thread.Sleep() verwende.

Thread thread = new Thread(new ThreadStart(this.CreateConnection));
thread.Start();

private void CreateConnection()
{
    new Connection(this.connection_ConnectedClient);
}

In dieser Klasse warte ich aus Sicherheitsgründen immer auf eine Antwort des Gegenübers bis ich weitersende. Das sieht dann so aus:

do
{
    System.Threading.Thread.Sleep(waitLength);
} while (!this.sendFinished);

Das eigentliche Problem könnte wohl daran liegen, dass ich zu einer hergestellten Verbindung ein ChatFenster bereitstelle, welches ich natürlich nur im GUI-Thread erstellen kann. Somit könnte es doch sein, dass mein Vorhaben gar nicht so möglich ist oder?

Bin für jede Antwort dankbar. 😉

Edit: Hat sich keiner mehr gemeldet und war wohl auch nicht nötig, habe es jetzt irgendwie zusammengeschustert.