Seit einigen Tagen beschäftigt mich das Problem, dass stoppen eines Multiservers , alles andere funktioniert prima, bis auf die Verbindung wieder zu beeden z.B. durch abbruch vom User (Form schließen und ähnliches). Ich mache alles mit Threading, aber wenn ich versuche den Server zu stoppen, freezt einfach alles .
Der Code:
MfG
Der Code:
VB.NET-Quellcode
- Imports System.Net
- Imports System.Net.Sockets
- Imports System.IO
- Public Class Form1
- Dim started As Boolean = False
- Private server As TcpListener
- Private client As New Sockets.TcpClient
- Private IPPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 5358)
- Private Delegate Sub Auswerten(ByVal s As String)
- Private Delegate Sub AddItem(ByVal c As Connection)
- Private Delegate Sub DelItem(ByVal c As Connection)
- Private tmp As String
- Private main As New System.Threading.Thread(AddressOf StartServer)
- Dim connections As New List(Of Connection)
- Private Structure Connection
- Dim stream As NetworkStream
- Dim streamw As StreamWriter
- Dim streamr As StreamReader
- Dim lst As ListViewItem
- End Structure
- Sub StopServer()
- main.Abort()
- For Each c As Connection In connections
- c.stream.Close()
- c.streamr.Close()
- c.streamw.Close()
- Next
- server.Stop()
- client.Close()
- End Sub
- Sub StartServer(ByVal port As Integer)
- IPPoint = New IPEndPoint(IPAddress.Any, port)
- server = New TcpListener(IPPoint)
- server.Start()
- While True
- Try
- client = server.AcceptTcpClient
- Catch
- Exit Sub
- End Try
- Dim c As New Connection
- c.stream = client.GetStream
- c.streamr = New StreamReader(c.stream)
- c.streamw = New StreamWriter(c.stream)
- c.lst.Text = c.streamr.ReadLine
- connections.Add(c)
- Me.Invoke(New AddItem(AddressOf AddItem1), c)
- Dim t As New System.Threading.Thread(AddressOf Listen)
- t.Start(c)
- End While
- End Sub
- Private Sub Listen(ByVal con As Connection)
- Do
- Try
- tmp = con.streamr.ReadLine
- Me.Invoke(New Auswerten(AddressOf Auswerten1), tmp)
- Catch ex As Exception
- Me.Invoke(New DelItem(AddressOf DelItem1), con)
- Exit Do
- End Try
- Loop
- End Sub
- Private Sub AddItem1(ByVal c As Connection) ' User hinzufügen
- ListView1.Items.Remove(c.lst)
- End Sub
- Private Sub DelItem1(ByVal c As Connection) 'User wieder löschen
- ListView1.Items.Remove(c.lst)
- End Sub
- Private Sub Auswerten1(ByVal s As String)
- MsgBox(tmp)
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- If started = False Then
- Button1.Text = "Stop"
- started = True
- main.Start()
- Else
- Button1.Text = "Start"
- started = False
- StopServer()
- End If
- End Sub
- Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
- Application.Exit()
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
- e.Cancel = False
- StopServer()
- e.Cancel = True
- End Sub
- End Class
MfG