Ich hab ein Problem das sich seit Tagen nicht lösen lässt, ich habe anhan des Multiserver TCP Tutorials einen Client und Server gecodet.
Alles ging perfekt auch das schließen des Servers, aber nun wo ich alles mit OOP gemacht hab kriege ich beim schließen des Server folgende Exception
Das "Read" dient nur zum finden des Fehlers.
Hier mal alles was ich gecodet habe:
Server:
Spoiler anzeigen
Connection:
Spoiler anzeigen
MfG
Alles ging perfekt auch das schließen des Servers, aber nun wo ich alles mit OOP gemacht hab kriege ich beim schließen des Server folgende Exception
Das "Read" dient nur zum finden des Fehlers.
Hier mal alles was ich gecodet habe:
Server:
VB.NET-Quellcode
- Imports System.Net
- Imports System.Net.Sockets
- Imports System.Threading.Thread
- Imports System.IO
- Public Class server
- Public Event newmsg(ByVal message As String, ByVal c As connection)
- Public Event c_connection_lost(ByVal c As connection)
- Public Event c_connected(ByVal c As connection)
- Public Event server_closed()
- Private tcpserver As TcpListener
- Private client As New TcpClient
- Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000)
- Private list As New List(Of connection)
- Dim t As Threading.Thread = New Threading.Thread(AddressOf waitforconnection)
- Private receive As Boolean
- Public Sub start(ByVal port As Integer)
- Try
- close()
- client = New TcpClient
- ipendpoint = New IPEndPoint(IPAddress.Any, port)
- tcpserver = New TcpListener(ipendpoint)
- tcpserver.Start()
- Catch ex As Exception
- MsgBox("Server failed to start; " & ex.Message)
- End Try
- receive = True
- t = New Threading.Thread(AddressOf waitforconnection)
- t.IsBackground = True
- t.Start()
- End Sub
- Public Sub close()
- Try
- receive = False
- For Each c As connection In list
- c.close()
- Next
- MsgBox("2")
- client.Close()
- MsgBox("3")
- tcpserver.Stop()
- MsgBox("4")
- Catch ex As Exception
- MsgBox("Serverclose: " & ex.Message)
- End Try
- RaiseEvent server_closed()
- End Sub
- Private Sub waitforconnection()
- While receive
- Try
- client = tcpserver.AcceptTcpClient
- Catch ex As Exception
- Exit Sub
- End Try
- Dim tmp_stream As NetworkStream = client.GetStream
- Dim c As New connection(tmp_stream)
- c.lst = New ListViewItem
- c.lst.Text = c.read 'Username lesen
- c.lst.SubItems.Add(c.read) 'Land lesen
- AddHandler c.newmsg, AddressOf newmsg_fromclient
- AddHandler c.connected, AddressOf client_connected
- AddHandler c.connection_lost, AddressOf client_connection_lost
- list.Add(c)
- c.start()
- End While
- End Sub
- Private Sub client_connected(ByVal c As connection)
- RaiseEvent c_connected(c)
- End Sub
- Private Sub newmsg_fromclient(ByVal message As String, ByVal c As connection)
- RaiseEvent newmsg(message, c)
- End Sub
- Private Sub client_connection_lost(ByVal c As connection)
- list.Remove(c)
- RaiseEvent c_connection_lost(c)
- End Sub
- End Class
Connection:
VB.NET-Quellcode
- Imports System.IO
- Imports System.Net.Sockets
- Public Class connection
- Private stream As NetworkStream
- Private streamw As StreamWriter
- Private streamr As StreamReader
- Public receive As Boolean
- Public lst As ListViewItem
- Public Event newmsg(ByVal message As String, ByVal c As connection)
- Public Event connection_lost(ByVal c As connection)
- Public Event connected(ByVal c As connection)
- Dim t As Threading.Thread = New Threading.Thread(AddressOf listen)
- Sub New(ByVal server_stream As NetworkStream)
- stream = server_stream
- streamr = New StreamReader(stream)
- streamw = New StreamWriter(stream)
- End Sub
- Sub start()
- receive = True
- Dim t As New Threading.Thread(AddressOf listen)
- t.Start()
- RaiseEvent connected(Me)
- End Sub
- Sub close()
- receive = False
- streamr.Close()
- streamw.Close()
- stream.Close()
- End Sub
- Sub write(ByVal s As String)
- Try
- streamw.WriteLine(s)
- streamw.Flush()
- Catch ex As Exception
- close()
- MsgBox("Write: " & ex.Message)
- RaiseEvent connection_lost(Me)
- End Try
- End Sub
- Function read()
- Try
- Return streamr.ReadLine()
- Catch ex As Exception
- close()
- MsgBox("Read: " & ex.Message) 'hier kommt die Exception, denke es liegt daran das er schließen will, aber er liest ja noch im Stream
- Return Nothing
- RaiseEvent connection_lost(Me)
- End Try
- End Function
- Private Sub listen()
- While receive
- Try
- Dim tmp As String = read()
- If Not tmp = Nothing Then
- RaiseEvent newmsg(tmp, Me)
- End If
- Catch ex As Exception
- close()
- MsgBox("Listen:" & ex.Message)
- RaiseEvent connection_lost(Me)
- Exit While
- End Try
- End
- End While
- End Sub
- End Class
MfG