VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • 请教有关vb.net中TCP编程的问题

最近写一个TCP SERVER的程序,遇到一个问题,使用 BeginAcceptTcpClient 异步接受Client的连接,过程都是正常的,但我是一直允许新的客户端进行连接,所以在使用了EndAcceptTcpClient后,会再次使用BeginAcceptTcpClient进行异步等待新的客户端的接入. 此时,我想手动关闭SERVER, 在关闭过程中使用Listener.Stop()来停止侦听,但由于前面使用了BeginAcceptTcpClient,还没有接受到新的客户端,马上就会跳到EndAcceptTcpClient行提示出错,出错信息为:无法访问已释放的对象。 对象名:“System.Net.Sockets.Socket”。

我把代码做了简化,但同样会有这样的问题,希望大家帮我看看,我应该怎么去把Listener进行STOP操作,(不作STOP操作进行启动SERVER时,又报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。)

下面代码第52行时进行STOP,_Listener.Stop()
错误出在第19行上 tcpClient = tempListener.EndAcceptTcpClient(result)

有什么办法可以把 BeginAcceptTcpClient 状态取消掉, 取消掉后再进行 stop 操作应该就没有问题了.

我使用的VS版本为 VS2008

Visual Basic code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
 
Public Class Form1
 
    Private _Listener As TcpListener
    Private _Connections As New ArrayList       '记录连接客户端列表
    Private _TcpServerThread As Thread          'TCP服务器进程
 
 
    ''' <summary>
    ''' 接受新的客户端事件
    ''' </summary>
    Private Sub DoAcceptClient(ByVal result As IAsyncResult)
        Dim tempListener As TcpListener = CType(result.AsyncState, TcpListener)
 
        Dim tcpClient As New TcpClient
        tcpClient = tempListener.EndAcceptTcpClient(result)
        _Connections.Add(tcpClient)
        _Listener.BeginAcceptTcpClient(AddressOf DoAcceptClient, _Listener)
    End Sub
 
    ''' <summary>
    ''' TCP侦听线程主体
    ''' </summary>
    Private Sub TCP_Listen()
        _Listener = New TcpListener(IPAddress.Any, 1314)                        '创建侦听,指定IP和端口
        _Listener.Start()                                                       '侦听开始
        _Listener.BeginAcceptTcpClient(AddressOf DoAcceptClient, _Listener)     '异步等待客户端
 
        While True
            '暂时先不做任何事情
        End While
    End Sub
 
 
    ''' <summary>
    ''' 开始服务器按钮
    ''' </summary>
    Private Sub ButtonStart_Click(ByVal sender As System.ObjectByVal As System.EventArgs) Handles ButtonStart.Click
        _TcpServerThread = New Thread(New ThreadStart(AddressOf TCP_Listen))
        _TcpServerThread.Start()
    End Sub
 
 
    ''' <summary>
    ''' 结束服务器按钮
    ''' </summary>
    Private Sub ButtonStop_Click(ByVal sender As System.ObjectByVal As System.EventArgs) Handles ButtonStop.Click
        If _Listener IsNot Nothing Then
            _Listener.Stop()
            _Listener = Nothing
        End If
 
        If _TcpServerThread.IsAlive Then
            _TcpServerThread.Abort()
        End If
        _TcpServerThread = Nothing
    End Sub
End Class


相关教程