Huhu,
da ich mich momentan bisl an VB.net wage, hatte ich vor mir einen Kleinen Consolen-Chat zu erstellen. Funktioniert ganz gut Das einzige was ich mir nicht erklären kann, ist, wenn ich den Server im Debug ausführe bekomme ich keinerlei Fehlermeldungen. Erstelle ich die Anwendung und führe diese aus bekomme ich aber nach einiger Zeit eine ArgumentNullException. Komischerweise müsste die von meinen Try block abgefangen werden. Hier mal der Code:
Server:
Client:
Der Fehler tritt sehr gut auf, wenn ich nur mit einem Client immer wieder connecte und disconnecte, also server laufen lassen und client anwendung auf und zu etc....
Ich hoffe ich könnt mir da helfen
Mit freundlichen Grüßen
Kai
da ich mich momentan bisl an VB.net wage, hatte ich vor mir einen Kleinen Consolen-Chat zu erstellen. Funktioniert ganz gut Das einzige was ich mir nicht erklären kann, ist, wenn ich den Server im Debug ausführe bekomme ich keinerlei Fehlermeldungen. Erstelle ich die Anwendung und führe diese aus bekomme ich aber nach einiger Zeit eine ArgumentNullException. Komischerweise müsste die von meinen Try block abgefangen werden. Hier mal der Code:
Server:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Net
- Imports System.Text
- Imports System.Threading
- Module Module1
- Dim ClientNames As Hashtable = New Hashtable
- Dim ClientConnections As Hashtable = New Hashtable
- Dim Connections As Integer = 0
- Dim Server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
- Sub Main()
- Dim Port As Integer = 93
- Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
- Dim ipAdress As IPAddress = ipHostInfo.AddressList(0)
- Dim localEP As New IPEndPoint(ipAdress, Port)
- Dim CThreadRead As New ThreadStart(AddressOf ClientThreadRead)
- Try
- ' Server starten
- Server.Bind(localEP)
- Server.Listen(10)
- Console.WriteLine("Server rennt auf IP: " & ipAdress.ToString & ":" & Port.ToString & " und wartet auf Clients!")
- ' Verbindung zum Client aufbauen
- Dim isConnectedMSG As String = "Verbindung hergestellt!"
- Do While True
- 'Console.WriteLine("Baue neue Verbindung auf")
- Dim ClientSocket As Socket = Server.Accept
- 'Console.WriteLine("Verbindung akzeptiert")
- If ClientSocket.Connected Then
- 'Console.WriteLine("Verbindung zur Hashtabelle hinzugefügt")
- ClientConnections.Add(Connections, ClientSocket)
- 'Console.WriteLine("Client zur Hashtabelle hinzugefügt")
- ClientNames.Add(ClientSocket, "Client " & Connections)
- 'Console.WriteLine("Verbindung zum Client: '" & Clients(ClientSocket) & "' wird aufgebaut!")
- 'Console.WriteLine(isConnectedMSG)
- 'Console.WriteLine("Bereite Nachricht an Client vor")
- Dim message() As Byte = Encoding.ASCII.GetBytes(isConnectedMSG)
- 'Console.WriteLine("Sende Nachricht an Client")
- ClientSocket.Send(message)
- 'Console.WriteLine("Erzeuge neuen Thread")
- Dim GetDataThread As New Thread(CThreadRead)
- 'Console.WriteLine("Starte Thread")
- GetDataThread.Start()
- Connections += 1
- End If
- Loop
- Catch ex As Exception
- Console.WriteLine(ex.Message)
- Finally
- Console.WriteLine("Und absturz!")
- Server.Shutdown(SocketShutdown.Both)
- Server.Close()
- Console.ReadLine()
- End Try
- End Sub
- Public Sub ClientThreadRead()
- Console.WriteLine("Lese Client aus den Connections")
- Dim ThisClientSocket As Socket = ClientConnections(Connections - 1)
- Try
- Console.WriteLine("Dim Bytes")
- Dim Bytes(1023) As Byte
- Console.WriteLine("Dim CountBytesFromClient")
- Dim CountBytesFromClient As Integer
- Console.WriteLine("Starte die Do-While")
- Do While True
- Console.WriteLine("CountBytesFromClient = ClientSocket.Receive(Bytes)" & Bytes.Length)
- CountBytesFromClient = ThisClientSocket.Receive(Bytes)
- Console.WriteLine("if " & CountBytesFromClient.ToString)
- If ThisClientSocket.Connected Then
- Console.WriteLine("Dim str " & CountBytesFromClient.ToString)
- Dim str As String = Encoding.ASCII.GetString(Bytes, 0, CountBytesFromClient)
- Console.WriteLine(str)
- For Each Client In ClientConnections
- Try
- Dim message() As Byte = Encoding.ASCII.GetBytes(str)
- Client.Value.Send(message)
- Catch ex As Exception
- Console.WriteLine(ex.Message)
- End Try
- Next
- End If
- Loop
- Catch ex As ArgumentNullException
- Catch ex As Exception
- Console.WriteLine("Verbindung zum Client: '" & ClientNames(ThisClientSocket) & "' unterbrochen: " & ex.Message)
- Finally
- ClientNames.Remove(ThisClientSocket)
- ClientConnections.Remove(Connections - 1)
- ThisClientSocket.Close()
- End Try
- End Sub
- End Module
Client:
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Net
- Imports System.Text
- Imports System.Threading
- Module Module1
- Dim Server As Socket
- Sub Main()
- Dim TServerData As New ThreadStart(AddressOf GetServerData)
- Dim TClientData As New ThreadStart(AddressOf SendServerData)
- Server = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
- Dim ipHost As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
- Dim ServerAdress As IPAddress = ipHost.AddressList(0)
- Dim EP As New IPEndPoint(ServerAdress, 93)
- Try
- Server.Connect(EP)
- Dim port As Integer = CType(Server.RemoteEndPoint, IPEndPoint).Port
- Dim tcpip As String = CType(Server.RemoteEndPoint, IPEndPoint).Address.ToString
- Console.WriteLine("Verbindung zu {0}/Port {1} ist hergestellt!", tcpip, port)
- Dim GetDataThread As New Thread(TServerData)
- GetDataThread.Start()
- Dim SendDataThread As New Thread(TClientData)
- SendDataThread.Start()
- Console.WriteLine("Was möchten Sie dem Server mitteilen?")
- Catch ex As ThreadAbortException
- Catch ex As Exception
- Console.WriteLine(ex.ToString)
- Server.Shutdown(SocketShutdown.Both)
- Server.Close()
- Console.ReadLine()
- End Try
- End Sub
- Public Sub SendServerData()
- Try
- Do While True
- Dim strMessage As String = Console.ReadLine
- Dim message() As Byte = Encoding.ASCII.GetBytes(strMessage)
- Server.Send(message)
- Loop
- Catch ex As Exception
- Console.WriteLine("Sende-Fehler: " & ex.Message)
- Console.ReadLine()
- End Try
- End Sub
- Public Sub GetServerData()
- Try
- Do While True
- Dim bytes(1024) As Byte
- Dim countBytesFromServer As Integer
- countBytesFromServer = Server.Receive(bytes)
- Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, countBytesFromServer))
- Loop
- Catch ex As Exception
- Console.WriteLine("Empfangs-Fehler: " & ex.Message)
- Console.ReadLine()
- End Try
- End Sub
- End Module
Der Fehler tritt sehr gut auf, wenn ich nur mit einem Client immer wieder connecte und disconnecte, also server laufen lassen und client anwendung auf und zu etc....
Ich hoffe ich könnt mir da helfen
Mit freundlichen Grüßen
Kai