tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
852
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von exiter28
    exiter28 exiter28 ist offline Mitglied Gold
    Registriert seit
    Apr 2009
    Beiträge
    175
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    
    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-Code:
    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(iv0iv.Length)

            
    Dim cs As New CryptoStream(msrd.CreateEncryptorCryptoStreamMode.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.ObjectByVal e As System.EventArgsHandles 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 sinddann:
                
    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.ObjectByVal e As System.EventArgsHandles cbCon.Click
            On Error 
    GoTo fehler    ' bei Fehler, gehe zu Sprungmarke fehler:
            If txtIP.Text = "" Then                                                             ' 
    Wenn Textbox "txtIP" leer istdann:
                
    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(ipport)                                                  ' 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ältdann:
                    
    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.ObjectByVal e As System.EventArgsHandles 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 Fehlergehe zu Sprungmarke fehler:
            
    entschluesseln()                                                                    ' Prozedur entschluesseln aufrufen
            Exit Sub ' 
    Prozedur verlassen
    fehler
    :  ' Sprungmarke fehler:
        End Sub
    End Class 
     

  2. #2
    Avatar von exiter28
    exiter28 exiter28 ist offline Mitglied Gold
    Registriert seit
    Apr 2009
    Beiträge
    175
    hat keiner eine Idee?
     

Ähnliche Themen

  1. Chat zum Chat Messenger umbauen
    Von Pranox im Forum Coders Talk
    Antworten: 4
    Letzter Beitrag: 02.02.10, 12:23
  2. Flash Media Server und Flash Video Chat (PPV Chat)
    Von Doogie im Forum Flash Plattform
    Antworten: 0
    Letzter Beitrag: 19.05.09, 17:59
  3. Suche Chat Skript, moderierter Chat
    Von SpAder im Forum PHP
    Antworten: 7
    Letzter Beitrag: 17.10.05, 14:52
  4. Antworten: 3
    Letzter Beitrag: 10.09.05, 11:08
  5. Chat
    Von rauch_c im Forum .NET Archiv
    Antworten: 7
    Letzter Beitrag: 21.05.04, 10:07