TCPListener - Formular - Endlosschleife


Julian Maicher

Erfahrenes Mitglied
#1
Hi,

Ich mache gerade meine ersten Schritte in der Netzwerkprogrammierung um möchte ein ganz simples Chat Programm schreiben. Erstmal möchte ich nur Daten an einen Server senden.
Damit der TCPListener immer "hört" habe ich eine Endlosschleife eingebaut. Das habe ich bereits in diversen Beispielen gesehen, doch keines davon verwendete zur Ausgabe Formulare, sondern die Console.
Starte ich jetzt die Endlosschleife reagiert das Formular nicht mehr. Ok DoEvents habe ich mir gedacht, aber das geht auch nicht wirklich. In der Endlosschleife erfolgt nämlich eine Ausgabe in einer Listbox, die auch bei DoEvents nicht erscheint.
Mein bisheriger Code:
Code:
        Dim port As Integer = 13000
        Dim localAddr As IPAddress = IPAddress.Parse("127.0.0.1")
        Dim server As New TcpListener(localAddr, port)
        server.Start()

        Dim bytes(10000) As Byte
        Dim data As String

        While True
            lstListen.Items.Add(DateTime.Now.ToString.Substring(11) & ": Warte auf Client ...")
            Dim client As TcpClient = server.AcceptTcpClient
            lstListen.Items.Add(DateTime.Now.ToString.Substring(11) & ": Client verbunden!")
            Dim stream As NetworkStream = client.GetStream

            data = Nothing
            Dim i As Integer
            i = stream.Read(bytes, 0, bytes.Length)
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
            lstListen.Items.Add(DateTime.Now.ToString.Substring(11) & ":" & data)

            stream.Close()
            client.Close()
        End While
Ich möchte das ganze gerne mit TCPClient / -Listener realisieren und ohne Threads, das muss doch gehen, oder?

Danke,

suye
 
#2
Hallo!

Ich progge nur in C#.
Aber ich glaube zu verstehen was Du meinst. Ich empfehle Dir das ganze asynchron zu programmieren. Ich meine damit Eventhandler die bei Datenein-/ u. ausgang ausgelöst werden.
So würde das bei mir in C# aussehen:
Code:
//SendeEreignisBehandlung wird initialisiert.
AsyncCallback sendData = new AsyncCallback(OnDataSend);
s_Socket.BeginSend(												
	abyBuffer, 0, abyBuffer.Length, SocketFlags.None, sendData, s_Socket);

//EmpfangsEreignisBehandlung wird initialisiert.
AsyncCallback reciveData = new AsyncCallback(OnRecivedData);
s_Socket.BeginReceive(
	abyBuffer, 0, abyBuffer.Length, SocketFlags.None, reciveData, s_Socket);
Ob Dir das jetzt hilft kann ich Dir jetzt logischerweise leider nicht sagen. Aber ich hoffe es hilft. :)

MfG, cosmo
 
#3
du wirst nicht ohne Thread ( auslagern des arbeitsintensiven teils ) auskommen wenn du eine Form
nutzen möchtest. ohne das sie "einfriert".

ich bin Grade dabei meinen einfachen Client/Server Umzugbasteln das er in ner Form rennt.
momentan sind Client sowie Server Konsolenanwendungen.
wenn irgend jemand eine auch nur annähernde Idee hätte mit welcher Technik,
in vb.net es möglich ist auf eine Verbindung bzw Datenpaket eines Clients zu lauschen ...

bitte her damit

ps1: warum darf threading nicht genutzt werden bei dir ?

ps2 : asynchron = threading x(

Wie kann man einen bilateralen MiniChat organisieren?

grad getestet is recht nett als basis
http://www.informtools.de/kb.aspx?id=318

bin grad am testen wie wo wann was da passiert *G
 
Zuletzt bearbeitet: