User anzeigen im Chat in einer ListBox

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Confix.npage.de.

    User anzeigen im Chat in einer ListBox

    Hallo Ich habe folgendes Problem,Ich habe einen Chat programmiert und möchte jetzt gerne
    in einer ListBox die angemeldeten User angezeigt werden,der ganze Chat läuft über eine TCP-Verbindung.
    Die Serverversion ist eine Konsolenanwendung und der Client ein ganz normales Programm.
    Hier schreibe ich euch mal die beiden Codes.


    Server:

    Imports System.Net.Sockets
    Imports System.Text
    Module Module1
    Dim clientsList As New Hashtable
    Sub Main()
    Dim serverSocket As New TcpListener(port)
    Dim clientSocket As TcpClient
    Dim infiniteCounter As Integer
    Dim counter As Integer

    serverSocket.Start()
    msg("Server wurde gestartet ....")
    counter = 0
    infiniteCounter = 0
    For infiniteCounter = 1 To 2
    infiniteCounter = 1
    counter += 1
    clientSocket = serverSocket.AcceptTcpClient()

    Dim bytesFrom(10024) As Byte
    Dim dataFromClient As String

    Dim networkStream As NetworkStream = _
    clientSocket.GetStream()
    networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
    dataFromClient = _
    dataFromClient.Substring(0, dataFromClient.IndexOf("$"))

    clientsList(dataFromClient) = clientSocket

    broadcast(dataFromClient + " Hat den Chat betreten ", dataFromClient, False)


    msg(dataFromClient + " Hat den Chat betreten ")


    Dim client As New handleClinet
    client.startClient(clientSocket, dataFromClient, clientsList)
    Next

    clientSocket.Close()
    serverSocket.Stop()
    msg("Offline")
    Console.ReadLine()
    End Sub

    Sub msg(ByVal mesg As String)
    mesg.Trim()
    Console.WriteLine(" >> " + mesg)
    End Sub
    Private Sub broadcast(ByVal msg As String, _
    ByVal uName As String, ByVal flag As Boolean)
    Dim Item As DictionaryEntry
    For Each Item In clientsList
    Dim broadcastSocket As TcpClient
    broadcastSocket = CType(Item.Value, TcpClient)
    Dim broadcastStream As NetworkStream = _
    broadcastSocket.GetStream()
    Dim broadcastBytes As [Byte]()

    If flag = True Then
    broadcastBytes = Encoding.ASCII.GetBytes(uName + " schreibt : " + msg)
    Else
    broadcastBytes = Encoding.ASCII.GetBytes(msg)
    End If

    broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
    broadcastStream.Flush()
    Next
    End Sub

    Public Class handleClinet
    Dim clientSocket As TcpClient
    Dim clNo As String
    Dim clientsList As Hashtable

    Public Sub startClient(ByVal inClientSocket As TcpClient, _
    ByVal clineNo As String, ByVal cList As Hashtable)
    Me.clientSocket = inClientSocket
    Me.clNo = clineNo
    Me.clientsList = cList
    Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
    ctThread.Start()
    End Sub

    Private Sub doChat()
    Dim infiniteCounter As Integer
    Dim requestCount As Integer
    Dim bytesFrom(10024) As Byte
    Dim dataFromClient As String
    Dim sendBytes As [Byte]()
    Dim serverResponse As String
    Dim rCount As String
    requestCount = 0
    For infiniteCounter = 1 To 2
    infiniteCounter = 1
    Try
    requestCount = requestCount + 1
    Dim networkStream As NetworkStream = _
    clientSocket.GetStream()
    networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
    dataFromClient = _
    dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
    msg("Vom User - " + clNo + " : " + dataFromClient)
    rCount = Convert.ToString(requestCount)

    broadcast(dataFromClient, clNo, True)
    Catch ex As Exception
    MsgBox(ex.ToString)
    End Try
    Next
    End Sub

    End Class
    End Module



    So hier ist jetzt der Code vom Client:


    Imports System.Net.Sockets
    Imports System.Text
    Public Class MeinChat
    Dim clientSocket As New System.Net.Sockets.TcpClient()
    Dim serverStream As NetworkStream
    Dim readData As String
    Dim infiniteCounter As Integer


    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim outStream As Byte() = _
    System.Text.Encoding.ASCII.GetBytes(TextBox2.Text + "$")
    serverStream.Write(outStream, 0, outStream.Length)
    serverStream.Flush()
    TextBox2.Clear()

    End Sub

    Private Sub msg()
    If Me.InvokeRequired Then
    Me.Invoke(New MethodInvoker(AddressOf msg))
    Else
    TextBox1.Text = TextBox1.Text + Environment.NewLine + " >> " + readData
    End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
    readData = "Du hast den Server betreten ..."
    msg()
    clientSocket.Connect("IP", Port)
    'Label1.Text = "Client Socket Program - Server Connected ..."
    serverStream = clientSocket.GetStream()

    Dim outStream As Byte() = _
    System.Text.Encoding.ASCII.GetBytes(TextBox3.Text + "$")
    serverStream.Write(outStream, 0, outStream.Length)
    serverStream.Flush()

    Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf getMessage)
    ctThread.Start()
    End Sub

    Private Sub getMessage()
    For infiniteCounter = 1 To 2
    infiniteCounter = 1
    serverStream = clientSocket.GetStream()
    Dim buffSize As Integer
    Dim inStream(10024) As Byte
    buffSize = clientSocket.ReceiveBufferSize
    serverStream.Read(inStream, 0, buffSize)
    Dim returndata As String = _
    System.Text.Encoding.ASCII.GetString(inStream)
    readData = "" + returndata
    msg()
    Next
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged

    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged

    End Sub

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)

    End Sub

    Private Sub ToolStripContainer1_TopToolStripPanel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub

    Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

    End Sub
    End Class

    2. Problem wenn ich den Client beende bleibt er trotzdem im Task-Manager drinne,wodran liegt das?


    Ich würde mich sehr freuen wenn ihr mir einen Code schreiben könntet!!


    Mit Freundlichen Grüßen
    Tobias
    oh man wenn du den Code nicht verstehst..
    Au0erdem benutzt man ein VB Tag und sollte Leere Subs vermeiden (speicher verbrauch)
    Einfach beim Einloggen kick und verabschieden eines Users die Usernamen mit Split auflisten an die Clients senden Clients empfangen es Leeren die Listboxen und Adden die Items, wo liegt das Problem?
    Zwar ist dass was du schreibst aber auch ich Spam aber lern erstmal die Grundlagen (müssen nicht alle sein) aber einige und du musst schon wissen was Split ist und den Code auch verstehen, wie man ne Listbox cleart solltest du auch wissen und auch wie man Items hinzufügt.