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)
und hier die Eingabeform
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