Unerklärliche ArgumentNullException beim Start der anwendung

  • VB.NET

    Unerklärliche ArgumentNullException beim Start der anwendung

    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:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.Text
    4. Imports System.Threading
    5. Module Module1
    6. Dim ClientNames As Hashtable = New Hashtable
    7. Dim ClientConnections As Hashtable = New Hashtable
    8. Dim Connections As Integer = 0
    9. Dim Server As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
    10. Sub Main()
    11. Dim Port As Integer = 93
    12. Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
    13. Dim ipAdress As IPAddress = ipHostInfo.AddressList(0)
    14. Dim localEP As New IPEndPoint(ipAdress, Port)
    15. Dim CThreadRead As New ThreadStart(AddressOf ClientThreadRead)
    16. Try
    17. ' Server starten
    18. Server.Bind(localEP)
    19. Server.Listen(10)
    20. Console.WriteLine("Server rennt auf IP: " & ipAdress.ToString & ":" & Port.ToString & " und wartet auf Clients!")
    21. ' Verbindung zum Client aufbauen
    22. Dim isConnectedMSG As String = "Verbindung hergestellt!"
    23. Do While True
    24. 'Console.WriteLine("Baue neue Verbindung auf")
    25. Dim ClientSocket As Socket = Server.Accept
    26. 'Console.WriteLine("Verbindung akzeptiert")
    27. If ClientSocket.Connected Then
    28. 'Console.WriteLine("Verbindung zur Hashtabelle hinzugefügt")
    29. ClientConnections.Add(Connections, ClientSocket)
    30. 'Console.WriteLine("Client zur Hashtabelle hinzugefügt")
    31. ClientNames.Add(ClientSocket, "Client " & Connections)
    32. 'Console.WriteLine("Verbindung zum Client: '" & Clients(ClientSocket) & "' wird aufgebaut!")
    33. 'Console.WriteLine(isConnectedMSG)
    34. 'Console.WriteLine("Bereite Nachricht an Client vor")
    35. Dim message() As Byte = Encoding.ASCII.GetBytes(isConnectedMSG)
    36. 'Console.WriteLine("Sende Nachricht an Client")
    37. ClientSocket.Send(message)
    38. 'Console.WriteLine("Erzeuge neuen Thread")
    39. Dim GetDataThread As New Thread(CThreadRead)
    40. 'Console.WriteLine("Starte Thread")
    41. GetDataThread.Start()
    42. Connections += 1
    43. End If
    44. Loop
    45. Catch ex As Exception
    46. Console.WriteLine(ex.Message)
    47. Finally
    48. Console.WriteLine("Und absturz!")
    49. Server.Shutdown(SocketShutdown.Both)
    50. Server.Close()
    51. Console.ReadLine()
    52. End Try
    53. End Sub
    54. Public Sub ClientThreadRead()
    55. Console.WriteLine("Lese Client aus den Connections")
    56. Dim ThisClientSocket As Socket = ClientConnections(Connections - 1)
    57. Try
    58. Console.WriteLine("Dim Bytes")
    59. Dim Bytes(1023) As Byte
    60. Console.WriteLine("Dim CountBytesFromClient")
    61. Dim CountBytesFromClient As Integer
    62. Console.WriteLine("Starte die Do-While")
    63. Do While True
    64. Console.WriteLine("CountBytesFromClient = ClientSocket.Receive(Bytes)" & Bytes.Length)
    65. CountBytesFromClient = ThisClientSocket.Receive(Bytes)
    66. Console.WriteLine("if " & CountBytesFromClient.ToString)
    67. If ThisClientSocket.Connected Then
    68. Console.WriteLine("Dim str " & CountBytesFromClient.ToString)
    69. Dim str As String = Encoding.ASCII.GetString(Bytes, 0, CountBytesFromClient)
    70. Console.WriteLine(str)
    71. For Each Client In ClientConnections
    72. Try
    73. Dim message() As Byte = Encoding.ASCII.GetBytes(str)
    74. Client.Value.Send(message)
    75. Catch ex As Exception
    76. Console.WriteLine(ex.Message)
    77. End Try
    78. Next
    79. End If
    80. Loop
    81. Catch ex As ArgumentNullException
    82. Catch ex As Exception
    83. Console.WriteLine("Verbindung zum Client: '" & ClientNames(ThisClientSocket) & "' unterbrochen: " & ex.Message)
    84. Finally
    85. ClientNames.Remove(ThisClientSocket)
    86. ClientConnections.Remove(Connections - 1)
    87. ThisClientSocket.Close()
    88. End Try
    89. End Sub
    90. End Module


    Client:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.Text
    4. Imports System.Threading
    5. Module Module1
    6. Dim Server As Socket
    7. Sub Main()
    8. Dim TServerData As New ThreadStart(AddressOf GetServerData)
    9. Dim TClientData As New ThreadStart(AddressOf SendServerData)
    10. Server = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
    11. Dim ipHost As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName)
    12. Dim ServerAdress As IPAddress = ipHost.AddressList(0)
    13. Dim EP As New IPEndPoint(ServerAdress, 93)
    14. Try
    15. Server.Connect(EP)
    16. Dim port As Integer = CType(Server.RemoteEndPoint, IPEndPoint).Port
    17. Dim tcpip As String = CType(Server.RemoteEndPoint, IPEndPoint).Address.ToString
    18. Console.WriteLine("Verbindung zu {0}/Port {1} ist hergestellt!", tcpip, port)
    19. Dim GetDataThread As New Thread(TServerData)
    20. GetDataThread.Start()
    21. Dim SendDataThread As New Thread(TClientData)
    22. SendDataThread.Start()
    23. Console.WriteLine("Was möchten Sie dem Server mitteilen?")
    24. Catch ex As ThreadAbortException
    25. Catch ex As Exception
    26. Console.WriteLine(ex.ToString)
    27. Server.Shutdown(SocketShutdown.Both)
    28. Server.Close()
    29. Console.ReadLine()
    30. End Try
    31. End Sub
    32. Public Sub SendServerData()
    33. Try
    34. Do While True
    35. Dim strMessage As String = Console.ReadLine
    36. Dim message() As Byte = Encoding.ASCII.GetBytes(strMessage)
    37. Server.Send(message)
    38. Loop
    39. Catch ex As Exception
    40. Console.WriteLine("Sende-Fehler: " & ex.Message)
    41. Console.ReadLine()
    42. End Try
    43. End Sub
    44. Public Sub GetServerData()
    45. Try
    46. Do While True
    47. Dim bytes(1024) As Byte
    48. Dim countBytesFromServer As Integer
    49. countBytesFromServer = Server.Receive(bytes)
    50. Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, countBytesFromServer))
    51. Loop
    52. Catch ex As Exception
    53. Console.WriteLine("Empfangs-Fehler: " & ex.Message)
    54. Console.ReadLine()
    55. End Try
    56. End Sub
    57. 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