Hey Leute,
ich habe ein Problem mit meinem TCP Chat nach 3 Tagen und viel gegoogle habe ich keine Lösung gefunden und hoffe jetzt das mir hier geholfen werden kann.
Mein Problem besteht darin das der Server oder der Client probleme beim disconnecten hat, er sendet immer einen leeren Text mit dem Nicknamen davor, dazu erscheint noch eine Fehlermeldung im Server selbst.
Bild1:
Wenn ich beide disconnecte sendet er die ganze Zeit den Nicknamen...
Bild2:
Hier der Server:
Spoiler anzeigen
hier der Client:
Spoiler anzeigen
Danke für eure Hilfe
Mfg
Dende()
ich habe ein Problem mit meinem TCP Chat nach 3 Tagen und viel gegoogle habe ich keine Lösung gefunden und hoffe jetzt das mir hier geholfen werden kann.
Mein Problem besteht darin das der Server oder der Client probleme beim disconnecten hat, er sendet immer einen leeren Text mit dem Nicknamen davor, dazu erscheint noch eine Fehlermeldung im Server selbst.
Bild1:
Wenn ich beide disconnecte sendet er die ganze Zeit den Nicknamen...
Bild2:
Hier der Server:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Imports System.Net
- Module Module1
- Private mobjTCPServer As TcpListener
- Private mobjClient As New TcpClient
- Private mobjIpEndpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8888) ' eingestellt ist port 8888
- Private mobjList As New List(Of clsConnection)
- Private mobjClientConnection As clsConnection
- Private mobjThreadToCloseServer As New Threading.Thread(AddressOf CloseServer)
- Sub Main()
- Try
- mobjThreadToCloseServer.Start()
- mobjTCPServer = New TcpListener(mobjIpEndpoint)
- mobjTCPServer.Start()
- Console.WriteLine("Server is running!")
- While True 'warten auf eine neue verbindung...
- mobjClient = mobjTCPServer.AcceptTcpClient
- Dim objConnect As New clsConnection(mobjClient.GetStream) ' und erstellen für die neue verbindung eine neue connection...
- objConnect.Stream = mobjClient.GetStream
- objConnect.StreamReader = New StreamReader(objConnect.Stream)
- objConnect.StreamWriter = New StreamWriter(objConnect.Stream)
- objConnect.Nick = objConnect.StreamReader.ReadLine 'Nickname wird übergeben
- mobjList.Add(objConnect) ' und fügen sie der liste der clients hinzu.
- Console.WriteLine(objConnect.Nick & " has joined.")
- For Each mobjClientConnection In mobjList ' an alle clients weitersenden.
- Try
- mobjClientConnection.StreamWriter.WriteLine(objConnect.Nick & " has joined :)")
- mobjClientConnection.StreamWriter.Flush()
- Catch ex As SocketException
- ' NOP
- Catch ex As Exception
- Console.WriteLine(ex.ToString)
- End Try
- Next
- Dim objThread As New Threading.Thread(AddressOf ListenToConnection)
- objThread.Start(objConnect)
- End While
- Catch ex As Exception
- Console.WriteLine(ex.ToString)
- End Try
- End Sub
- Private Sub ListenToConnection(ByVal con As Object)
- Dim objConnect As clsConnection = CType(con, clsConnection)
- Do
- Try
- Dim strTmp As String = objConnect.StreamReader.ReadLine ' warten, bis etwas empfangen wird...
- Console.WriteLine(objConnect.Nick & ": " & strTmp)
- For Each mobjClientConnection In mobjList ' an alle clients weitersenden.
- Try
- If mobjClient.Connected Then
- mobjClientConnection.StreamWriter.WriteLine(objConnect.Nick & ": " & strTmp)
- mobjClientConnection.StreamWriter.Flush()
- Else
- End If
- Catch ex As SocketException
- mobjClientConnection.StreamWriter.WriteLine(objConnect.Nick & " leaved the Chat :(")
- mobjClientConnection.StreamWriter.Flush()
- Catch ex As Exception
- Console.WriteLine(ex.ToString)
- End Try
- Next
- Catch
- 'mobjClientConnection.StreamWriter.WriteLine(objConnect.Nick & " leaved the Chat :(")
- mobjList.Remove(objConnect)
- Console.WriteLine(objConnect.Nick & " has exit.")
- Exit Do
- End Try
- Loop
- End Sub
- Private Sub CloseServer(ByVal con As Object)
- Do
- Dim strClosing As String
- Dim intCount As Int32
- Console.WriteLine("Pls type exit to close the Server")
- strClosing = Console.ReadLine()
- If strClosing = "exit" Then
- mobjTCPServer.Stop()
- End
- End If
- If strClosing = "test" Then
- For Each mobjClientConnection In mobjList
- intCount += 1
- Next
- Console.WriteLine(intCount & " Chatter online")
- intCount = 0
- End If
- Loop
- End Sub
- End Module
- #Region "clsConnection"
- Public Class clsConnection
- Private mobjStream As NetworkStream
- Private mobjStreamWriter As StreamWriter
- Private mobjStreamReader As StreamReader
- Private strNick As String
- Public Sub New(ByVal objStream As NetworkStream)
- mobjStream = objStream
- End Sub
- Public Property Stream() As NetworkStream
- Get
- Return mobjStream
- End Get
- Set(ByVal value As NetworkStream)
- mobjStream = value
- End Set
- End Property
- Public Property StreamWriter() As StreamWriter
- Get
- Return mobjStreamWriter
- End Get
- Set(ByVal value As StreamWriter)
- mobjStreamWriter = value
- End Set
- End Property
- Public Property StreamReader() As StreamReader
- Get
- Return mobjStreamReader
- End Get
- Set(ByVal value As StreamReader)
- mobjStreamReader = value
- End Set
- End Property
- Public Property Nick() As String
- Get
- Return strNick
- End Get
- Set(ByVal value As String)
- strNick = value
- End Set
- End Property
- End Class
- #End Region
hier der Client:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.IO
- Public Class frmClient
- Private mobjStream As NetworkStream
- Private mobjStreamWriter As StreamWriter
- Private mobjStreamReader As StreamReader
- Private mobjClient As New TcpClient
- Private mobjThead As Threading.Thread
- Private Delegate Sub DAddItem(ByVal s As String)
- Private mobjNick As String = "unknown"
- Private Sub AddItem(ByVal strText As String)
- rtfChat.Text += strText & vbCrLf
- End Sub
- Private Sub Listen()
- While mobjClient.Connected
- If mobjClient.Connected Then
- Try
- Me.Invoke(New DAddItem(AddressOf AddItem), mobjStreamReader.ReadLine)
- Catch
- If Not mobjClient.Connected Then
- 'Message()
- If btnDisconnect.Enabled = True Then
- MessageBox.Show("Verbindung zum Server abgebrochen!", "ThiZ Chat", MessageBoxButtons.OK)
- End If
- Else
- End If
- End Try
- End If
- End While
- End Sub
- Private Sub frmClient_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- mobjStream.Close()
- mobjClient.Close()
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- mobjNick = InputBox("Nickname: ", "Namen festlegen", "Chatter")
- End Sub
- Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
- Try
- If Not txtSend.Text = "" Then
- If mobjClient.Connected Then
- mobjStreamWriter.WriteLine(txtSend.Text)
- mobjStreamWriter.Flush()
- txtSend.Clear()
- Else
- Message()
- End If
- End If
- Catch ex As Exception
- HandleException(ex.ToString)
- End Try
- End Sub
- Private Sub txtSend_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtSend.KeyDown
- Try
- If e.KeyCode = Keys.Enter Then
- e.SuppressKeyPress = True
- btnSend_Click(sender, e)
- End If
- Catch ex As Exception
- HandleException(ex.ToString)
- End Try
- End Sub
- Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
- Try
- btnConnect.Enabled = False
- btnDisconnect.Enabled = True
- If txtServerIP.Text = "" Then
- MsgBox("Keine IP eingetragen!", "ThiZ Chat", MessageBoxButtons.OK)
- Else
- mobjClient = New TcpClient
- mobjClient.Connect(txtServerIP.Text, 8888) ' hier die ip des servers eintragen.
- End If
- If mobjClient.Connected Then
- mobjStream = mobjClient.GetStream
- mobjStreamWriter = New StreamWriter(mobjStream)
- mobjStreamReader = New StreamReader(mobjStream)
- mobjStreamWriter.WriteLine(mobjNick)
- mobjStreamWriter.Flush()
- mobjThead = New Threading.Thread(AddressOf Listen)
- mobjThead.Start()
- Else
- Message()
- End If
- Catch ex As Exception
- HandleException(ex.ToString)
- btnConnect.Enabled = True
- End Try
- txtSend.Focus()
- End Sub
- Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
- Try
- btnDisconnect.Enabled = False
- btnConnect.Enabled = True
- mobjStream.Close()
- mobjClient.Close()
- Catch ex As Exception
- HandleException(ex.ToString)
- btnDisconnect.Enabled = True
- End Try
- End Sub
- Private Sub rtfChat_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtfChat.TextChanged
- rtfChat.SelectionStart = rtfChat.Text.Length
- rtfChat.ScrollToCaret()
- End Sub
- Private Sub Message()
- MessageBox.Show("Keine Verbindung zum Server", "ThiZ Chat", MessageBoxButtons.OK)
- End Sub
- Private Sub HandleException(ByVal e As String)
- MsgBox(e, MsgBoxStyle.Information, "Fehler")
- End Sub
- End Class
Danke für eure Hilfe
Mfg
Dende()