【问题标题】:How to politely stop a TcpListener?如何礼貌地停止 TcpListener?
【发布时间】:2015-07-08 21:36:40
【问题描述】:

我有一个工作正常的 TCP 服务器,但现在我需要以安全的方式停止它和所有线程。 据我研究,Abort 方法不行

我调试过,当服务器启动但没有连接时,代码似乎停在了线上

Server = New TcpListener(IPAddress.Any, Port)

所以当我调用 StopServer 时,我收到一个关于 WSACancelBlokingCall 的错误 我不知道如何正确停止服务器。

这里是完整的代码,除了 StartTcpClient 是接收到数据。

#Region "TCP Receive variables"
    Dim TcpOpen As Boolean = False
    Private Server As TcpListener = Nothing
    Private ServerThread As Thread = Nothing
    Friend AckString As String = ""
#End Region

#Region "TCP"
    Public Sub StopServer()
        Server.Stop()
        ServerThread.Abort()
        TcpOpen = False
    End Sub
    Public Sub InitServer(ByVal Port As Integer)
        Server = New TcpListener(IPAddress.Any, Port)
        ServerThread = New Thread(AddressOf ConnectionListener)
        ServerThread.IsBackground = True
        ServerThread.Start()
        TcpOpen = True
    End Sub

    Private Sub ConnectionListener()
        Server.Start()
        While True
            Dim client As TcpClient = Server.AcceptTcpClient()
            Dim T As New Thread(AddressOf StartTcpClient)
            T.IsBackground = True
            T.Start(client)
        End While
    End Sub
#End Region

编辑: 我对代码进行了一些更改,现在似乎可以正常工作了。

Public Sub StopServer()
    TcpOpen = False
    Server.Stop()
    ServerThread = Nothing
End Sub
Private Sub ConnectionListener()
    Server.Start()
    While True
        If TcpOpen Then
            If Server.Pending Then
                Dim client As TcpClient = Server.AcceptTcpClient()
                Dim T As New Thread(AddressOf StartTcpClient)
                T.IsBackground = True
                T.Start(client)
            Else
                System.Threading.Thread.Sleep(10)
            End If
        Else
            Exit While
        End If
    End While
End Sub

【问题讨论】:

    标签: vb.net multithreading tcplistener


    【解决方案1】:
    1. 应该从客户端(而不是服务器)关闭连接。

    2. 客户端应向服务器发送应用消息以停止处理。

    3. 服务器应该停止处理

    4. 服务器应该执行 BeginDisconnect

    5. 服务器应该向客户端发送一个响应,表明连接可以关闭

    6. 客户端应该关闭连接。

    7. BeingDisconnect 发生时的服务器应该关闭/Dispose 监听器。

    【讨论】:

    • 当您说“客户端”时,您指的是远程端吗?如果没有连接,我如何停止 TcpListener?
    • 是的。你有一个客户端(主)和服务器(从)。服务器只应在客户端发出命令时执行操作。
    • 是的,但问题是 AcceptTcpClient 方法是一个阻塞调用,在这种情况下我无法停止服务器。现在我正在尝试使用 BeginAcceptTcpClient 方法,但仅适用于第一个连接。我认为我需要创建一个线程池,但我正在研究如何做。这一切对我来说有点令人困惑。我目前正在阅读这篇文章vbforums.com/…
    • 查看网页:msdn.microsoft.com/en-us/library/vstudio/…。这些示例适用于套接字,但可以替换为任何继承套接字类的类,例如 tcpclient 或 tcplistener。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2016-12-18
    • 2011-05-28
    • 2010-11-13
    • 2021-11-22
    相关资源
    最近更新 更多