开发一个C/S项目,涉及到服务端停止之后,客户端定时重连的问题,在开发过程中遇到了一个报错如下:
断开套接字连接后,只能通过异步方式再次重新连接,而且只能连接到不同的 EndPoint。 在操作完成前,在将不会退出的线程上必须调用 BeginConnect。
从网上查找相关资料后并未解决,突发奇想,利用万能的List类型解决了该问题,方法如下:
先添加全局变量
Private _Socket As New List(Of Socket)
再在连接的过程中添加几条_Socket.Clear():
Private Sub ConnectServer()
_Socket.Clear()
Dim SockClient As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
_Socket.Add(SockClient)
Dim Address As IPAddress = IPAddress.Parse(_ServerIPString)
Dim Endpoint As New IPEndPoint(Address, _ServerPort)
Try '捕获异常
_Socket(0).Connect(Endpoint) '发起连接,此处用List中的第一项索引来替代局部SockClient
Catch ss As SocketException
Dim strErrorMsg As String = ss.SocketErrorCode.ToString
strErrorMsg = strErrorMsg.Replace("TimedOut", "连接超时!")
strErrorMsg = strErrorMsg.Replace("ConnectionRefused", "连接被拒绝!")
If SockClient.Connected Then SockClient.Close()
_Socket.Clear()
MessageBox.Show(strErrorMsg, "连接异常", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
Catch s As Exception
If SockClient.Connected Then SockClient.Close()
_Socket.Clear()
MessageBox.Show(s.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End Try
End Sub
大功告成
测试结果:
反复断开服务端后,重新调用ConnectServer过程再次连接,均连接成功再无报错。