Form hängt beim StreamReader (ReadLine)

08/19/2013 21:41 Requi#1
Guten Morgen/Abend/Mittag,

ich wollte mich mehr mit dem Client/Server Prinzip auseinander setzen und eine kleine Konsole für einen Privat Server Emulator schreiben.

Ich kann es senden und der Emu bekommt es auch. Aber wenn ich es receiven will mit dem StreamReader hängt sich die Form auf.

Code:

Muss ich noch was anderes machen, oder warum hängt es sich auf und macht nie weiter?

MfG
08/19/2013 22:52 Tasiro#2
Es wird als Argument port eine Integer-Variable erwartet...
Wenn es bloß zum Testen ist, kannst du dir auch einen eigenen Server erstellen. Der lässt sich auch debuggen.
Wenn du eine Nachricht empfängst, solltest du das asynchron tun, z. B. in einem weiteren Thread. Damit blockiert das Empfangen nicht.

Hast du überprüft, ob die entsprechenden Zeilenenden gesendet wurden, oder dass dir überhaupt etwas gesendet wurde?
08/19/2013 23:21 Requi#3
[Only registered and activated users can see links. Click Here To Register...]
Der soll mir das was in der Konsole steht ausgeben im Client.
Aber es will nicht.
08/19/2013 23:43 Endecs#4
Debug und schau, was bei "sr.ReadLine()" steht.
Bzw. drück danach F10 und schau ob da ein Fehler kommt oder nicht.

Ansonsten sendet dein Server überhaupt die Information die du haben willst zurück?

greets,
Endecs
08/19/2013 23:51 Requi#5
Ja er sendet sie. Schon mit Breakpoints geschaut. Er zeigt mir da nichts an.
Also nicht nen leeren String sondern da ist nichts.
08/20/2013 00:13 Darkbanner#6
Du musst das ganze als Thread laufen lassen.
08/20/2013 00:27 Tasiro#7
Quote:
Originally Posted by Darkbanner View Post
Du musst das ganze als Thread laufen lassen.
Solltest. Unbedingt.

Quote:
Originally Posted by Requi View Post
Ja er sendet sie.
Und wie hast du das herausgefunden?

Laut meiner Glaskugel hängt sich dein Programm bei der Anweisung sr.ReadLine() auf, weil die Methode kein Zeilenende einliest, weil sie überhaupt nichts einliest, wie es scheint. Das liegt daran, dass es nichts einzulesen gibt, dass die TCP-Verbindung nur einseitig genutzt wird, soweit meine Glaskugel das beurteilen kann.
08/20/2013 01:39 Requi#8
Siehe im Screen oben :p
Ich lese es falsch. Das weiß ich.

Ich mache es jz ma schnell und sauber mit mehreren Threads. Mal sehen was raus kommt.

EDIT: Wie gesagt. Ich lese es falsch aus.
Wie ich es auslesen muss, habe ich keine Ahnung. Gesendet wird so:
Code:
public void Send(byte[] response)
        {
            if (_handler == null || !_handler.Connected) return;
            _handler.BeginSend(response, 0, response.Length, 0, SendCallback, _handler);
        }

        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                var handler = (Socket)ar.AsyncState;
                var bytesSent = handler.EndSend(ar);
            }
            catch (Exception e)
            {
                Out.WriteLine(e.ToString(), "Azure.Conn.Send", ConsoleColor.DarkRed);
            }
        }
Der Emulator selbst liest so:
Code:
public void ReadCallback(IAsyncResult ar)
        {
                var bytesRead = _handler.EndReceive(ar);
                if (bytesRead <= 0)
                {
                    if (_handler != null)
                    {
                        if (_user == null)
                            Destroy();
                        else
                            UserDisconnect();
                    }
                    return;
                }

                var content = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
                if (content == "bla")
                {
                 }
           }
Der Emulator wurde nicht von mir geschrieben nur als Anmerkung.
08/20/2013 13:47 Tasiro#9
Wann sendet der Emulator denn? Wenn als Nachricht "bla" ankommt?

Ich nehme an, das Send gehört zum Emulator. Was steht denn in response?
08/20/2013 13:51 kissein#10
Quote:
The following code examples demonstrate how to use the Socket class as a client to connect to remote network services and as a server to listen for connections from remote clients.
[Only registered and activated users can see links. Click Here To Register...]

und asynchron lesen
08/20/2013 14:20 Requi#11
Habs jetzt auch mal geschafft.
Jetzt habe ich das Problem, dass ich nur einmal senden kann.
Anonsten kommt das:
Quote:
Von der Übertragungsverbindung können keine Daten gelesen werden: Eine bestehende Verbindung wurde softwaregesteuert

durch den Hostcomputer abgebrochen.
Kommt dann, wenn ich lesen möchte.

Und im Emu kann auf der verworfene Objekt nicht zugegriffen werden. Aber woran das liegt weiß ich, denke ich mal.