Zeichenüberlauf bei Chat

exiter28

Erfahrenes Mitglied
hab ein kleines Problem mit meinen Chat-Programm.
Wenn ich einen längeren Text versende, dann scheint es so,
daß der Text nicht wieder aus dem cache geleert wird.
Zumindest scheint das so.....

Wenn ich kleinere Textteile versende, funtkioniert dies, aber
wenn größere Sätze versendet werden und im Anschluss
wieder ein Text dann wird der zuletzt gesendete Text an
den vorherigen Text irgendwie mit angefügt, oder der
erste Text überschrieben.

Kennt jemand so ein ähnliches Problem mit dem Socket?

Ich versuch mal ein bischen Code reinzustellen:


Also vom Client-Listener (läuft im Hintergrund)

Code:
Imports System.Security.Cryptography
Imports System.IO
Imports System.Net.Sockets
Imports System.Text

Public Class form1
    Private SimpleServer As TcpListener
    Private Client As New TcpClient
    Public Stream As NetworkStream
    Public clientdata As String                                                 ' Öffentliche Variable deklarieren
    Dim bytes() As Byte
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()                                                          ' Timer1 starten
        Timer1.Interval = (20)                                                  ' Timer1 Intervall = 0,02sec.
        NotifyIcon1.Visible = True                                              ' NotifiIcon in der Systemanzeige sichtbar machen
    End Sub

    Private Sub OnConnect(ByVal ar As System.IAsyncResult)
        On Error GoTo fehler    ' Bei Fehler gehe zu Sprungmarke fehler:
        Client = SimpleServer.EndAcceptTcpClient(ar)
        Stream = Client.GetStream

        ReDim bytes(Client.ReceiveBufferSize)
        Stream.BeginRead(bytes, 0, CInt(Client.ReceiveBufferSize), AddressOf onGetData, New Object)
        Exit Sub ' Prozedur verlassen
fehler:  ' Sprungmarke fehler
    End Sub
    Private Sub onGetData(ByVal ar As System.IAsyncResult)
        On Error GoTo fehler    ' Bei Fehler gehe zu Sprungmarke fehler:

        clientdata = Encoding.ASCII.GetString(bytes)
        'MsgBox((clientdata), , "Mitteilung von Chat-User")
        Stream.BeginRead(bytes, 0, CInt(Client.ReceiveBufferSize), AddressOf onGetData, New Object)
        System.Threading.Thread.Sleep(2500)

        Exit Sub ' Prozedur verlassen
fehler:  ' Sprungmarke fehler
    End Sub
    Private Sub ChatToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChatToolStripMenuItem.Click
        On Error GoTo fehler    ' Bei Fehler gehe zu Sprungmarke fehler:
        Form2.ShowDialog()                                                      ' Form2 öffnen
        Exit Sub ' Prozedur verlassen
fehler:  ' Sprungmarke fehler
    End Sub
    Private Sub CahtToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CahtToolStripMenuItem.Click
        NotifyIcon1.Visible = False                                             ' NotifyIcon1 sichtbar = nein
        Me.Close()                                                              ' Form schließen
    End Sub
    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If e.CloseReason = CloseReason.UserClosing Then 'wenn der User die Form schließt ... 
            'e.Cancel = True 'das Beenden wird unterbrochen 
            NotifyIcon1.Visible = False  'auch das Icon wieder angezeigt 
        End If
    End Sub
    Private Sub cbStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbStart.Click
        Dim leer As String = ""                                                 ' Variable deklarieren und instanzieren
        If txtPort.Text = leer Then                                             ' Wenn Textbox "txtPort" gleich der Var. leer ist, dann:
            MsgBox("Bitte Port angeben", MsgBoxStyle.Information, "Hinweis")    ' Meldungsbox ausgeben
            Exit Sub ' Prozedur verlassen
        Else                                                                    ' ansonsten:
            If IsNumeric(txtPort.Text) = True Then                              ' Wenn der Inhalt der Textbox "txtPort" ein numerischer Wert ist, dann:
                Dim port As Integer = CInt(txtPort.Text)                        ' Variable deklarieren und instanzieren
                SimpleServer = New TcpListener(System.Net.IPAddress.Parse(CStr(0)), port)
                SimpleServer.Start()
                SimpleServer.BeginAcceptTcpClient(AddressOf OnConnect, New Object)
                Me.Hide()                                                       ' Form "verstecken"
                Form2.txtPort.Text = CStr(port)                                 ' Der Form2 den Inhalt der Textbox "txtPort" übergeben
                Form2.ShowDialog()                                              ' Form2 anzeigen
            Else                                                                ' ansonsten:
                MsgBox("Es können nur Zahlen angegeben werden (1 - 65535)", MsgBoxStyle.Critical, "ACHTUNG!")   ' Meldungsbox ausgeben
                txtPort.Text = ""                                               ' Textbox "txtPort" leeren
                Exit Sub ' Prozedur verlassen
            End If
        End If
        Exit Sub
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Form2.rtxtEmpf2.Text = clientdata                                       ' Den Inhalt der öffentlichen Var. clientdata der Form2 übergeben
    End Sub
End Class


und hier die Eingabeform

PHP:
Imports System.Net.Sockets
Imports System.Text
Imports System.Security.Cryptography
Imports System.IO


Public Class Form2
    Private SimpleClient As New TcpClient
    Private Stream As NetworkStream
    Private con As String = "System.Net.Sockets.NetworkStream"

    Sub entschluesseln()                                                            ' Prozedur entschluesseln
        Dim rd As New RijndaelManaged
        Dim rijndaelIvLength As Integer = 16
        Dim md5 As New MD5CryptoServiceProvider
        Dim key() As Byte = md5.ComputeHash(Encoding.ASCII.GetBytes(txtKey2.Text))   ' Passwort von Textbox "txtKey2" holen

        md5.Clear()

        Dim encdata() As Byte = Convert.FromBase64String(rtxtEmpf2.Text)            ' Verschlüsselten Text aus RichTextBox "rtxtEmpf2" holen
        Dim ms As New MemoryStream(encdata)
        Dim iv(15) As Byte

        ms.Read(iv, 0, rijndaelIvLength)
        rd.IV = iv
        rd.Key = key

        Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)

        Dim data(CInt(ms.Length - rijndaelIvLength)) As Byte
        Dim i As Integer = cs.Read(data, 0, data.Length)

        rtxtEmpf.Text = System.Text.Encoding.ASCII.GetString(data, 0, i)             ' Entschlüsselten Text in die RichTextBox "rtxtEmpf" schreiben
        cs.Close()
        rd.Clear()
    End Sub
    Sub verschluesseln()                                                            ' Prozedur verschluesseln
        Dim rd As New RijndaelManaged

        Dim md5 As New MD5CryptoServiceProvider
        Dim key() As Byte = md5.ComputeHash(Encoding.ASCII.GetBytes(txtKey.Text))    ' Passwort von Textbox "txtKey" holen

        md5.Clear()
        rd.Key = key
        rd.GenerateIV()

        Dim iv() As Byte = rd.IV
        Dim ms As New MemoryStream

        ms.Write(iv, 0, iv.Length)

        Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
        Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(txtOrig.Text)       ' Text zum Verschlüsseln aus TextBox "txtOrig" holen

        cs.Write(data, 0, data.Length)
        cs.FlushFinalBlock()

        Dim encdata() As Byte = ms.ToArray()
        txtSend.Text = Convert.ToBase64String(encdata)                              ' Verschlüsselten Text in Textbox "txtSend" schreiben
        cs.Close()
        rd.Clear()
    End Sub
    Private Sub cbSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbSend.Click
        On Error GoTo fehler    ' bei Fehler, gehe zu Sprungmarke fehler:
        If txtOrig.Text = "" Or txtKey.Text = "" Then                                       ' Wenn Textbox "txtOrig" oder Textbox "txtKey" leer sind, dann:
            MsgBox("Bitte Text oder Passwort eingeben", MsgBoxStyle.Information, "Hinweis") ' Meldungsbox ausgeben
        Else                                                                                ' ansonsten:
            verschluesseln()                                                                ' Prozedur verschluesseln aufrufen
            Dim sendBytes As Byte() = _
            System.Text.Encoding.ASCII.GetBytes(txtSend.Text)
            Stream.Write(sendBytes, 0, sendBytes.Length)
            Stream.Flush()
            System.Threading.Thread.Sleep(1000)                                             ' Systempause einleiten (1sec.)
            txtOrig.Text = ""                                                               ' Textboxen leeren
            txtSend.Text = ""
            form1.clientdata = ""
            rtxtEmpf.Text = ""                                                              ' RichTextBoxen leeren
            rtxtEmpf2.Text = ""
        End If
        Exit Sub ' Prozedur verlassen
fehler:  ' Sprungmarke fehler:
    End Sub
    Private Sub cbCon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbCon.Click
        On Error GoTo fehler    ' bei Fehler, gehe zu Sprungmarke fehler:
        If txtIP.Text = "" Then                                                             ' Wenn Textbox "txtIP" leer ist, dann:
            MsgBox("IP-Adresse oder Domain angeben!", MsgBoxStyle.Information, "Hinweis")   ' Meldungsbox ausgeben
            Application.DoEvents()                                                          ' Systempause unterbrechen
            lblOK.Visible = False                                                           ' Label "lblOK" sichtbar = nein
            lblER.Visible = True                                                            ' Label "lblER" sichtbar = ja
            txtCon.Text = ""                                                                ' Textbox "txtcon" leeren
            Exit Sub ' Prozedur verlassen
        Else                                                                                ' ansonsten:
            Dim ip As String = txtIP.Text                                                   ' Variable deklarieren und instanzieren
            Dim port As Integer = CInt(txtPort.Text)                                        ' Variable deklarieren und instanzieren
            Me.Refresh()                                                                    ' Form neu laden
            SimpleClient.Connect(ip, port)                                                  ' Der Klasse Connect, IP und Port zuweisen
            Stream = SimpleClient.GetStream
            txtCon.Text = Stream.ToString
            Dim outStream As Byte() = _
            System.Text.Encoding.ASCII.GetBytes(txtSend.Text)
            Stream.Write(outStream, 0, outStream.Length)
            Stream.Flush()
            If txtCon.Text = con Then                                                       ' Wenn Textbox "txtCon" den Text von Var. con enthält, dann:
                lblER.Visible = False                                                       ' Label "lblER" sichtbar = nein
                lblOK.Visible = True                                                        ' Label "lblOK" sichtbar = ja
            Else                                                                            ' ansonsten:
                lblER.Visible = True                                                        ' Label "lblER" sichtbar = ja
                Exit Sub ' Prozedur verlassen
            End If
        End If
        Exit Sub
fehler:  ' Sprungmarke fehler:
    End Sub
    Private Sub ChatBeendenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChatBeendenToolStripMenuItem.Click
        Me.Close()                                                                          ' Form schließen
    End Sub
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()                                                                      ' Timer1 starten
        Timer1.Interval = (20)                                                              ' Timer1 Intervall = 0,02sec.
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        On Error GoTo fehler    ' bei Fehler, gehe zu Sprungmarke fehler:
        entschluesseln()                                                                    ' Prozedur entschluesseln aufrufen
        Exit Sub ' Prozedur verlassen
fehler:  ' Sprungmarke fehler:
    End Sub
End Class
 

Neue Beiträge

Zurück