VB.NET: TCP 客户端套接字超时?
VB.NET: TCP Client Socket timeout?
我有一个 TCP 客户端套接字,它在加载 Form1 时连接到服务器。如果连接时间太长,我需要一种方法让客户端套接字 "give up" 尝试连接到远程服务器。即 30 秒后超时。
目前,当套接字由于任何原因无法连接到服务器时,在可以访问服务器之前,表单似乎会冻结。
可能值得注意的是我正在使用 System.Net.Sockets.TcpClient()
这是用于创建连接的 My Sub:
Public serverStream As NetworkStream
Public clientSocket As New System.Net.Sockets.TcpClient()
Public Sub CreateTCPConnection()
Try
clientSocket.Connect(System.Net.IPAddress.Parse(My.Settings.ServerIP), My.Settings.ServerPort)
ConnectionStatusLbl.Text = "Connection: Connected"
ConnectionStatusPB.Image = My.Resources.LED_Green
'This should work according to MSDN but does not
clientSocket.SendTimeout = 3000
clientSocket.ReceiveTimeout = 3000
UpdateTimer.Start()
Catch ex As Exception
ConnectionStatusLbl.Text = "Connection: Not Connected"
ConnectionStatusPB.Image = My.Resources.LED_Red
clientSocket.Close()
MsgBox(ex.ToString)
End Try
End Sub
您可以线程化整个 CreateTCPConnection
函数,然后在主线程中使用 Timer
在 X 秒后中止线程,如果 public 布尔值未设置为真.
线程初始化的伪代码:
Dim isConnected as Boolean
Private Sub Form1_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
isConnected = false;
trd = New Thread(AddressOf CreateTCPConnection)
trd.IsBackground = True
//Afer the start function the thread tries to connect asyncron to your server
trd.Start()
Timer timer = new Timer();
//Start the timer to check the boolean
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start()
End Sub
Private Sub CreateTCPConnection()
//Your Connection method
End Sub
//Checks the isConnected status each second. If isConnected is false and 3 seconds are reached, the thread gets aborted.
Private Sub TimerEventProcessor(Object myObject,
EventArgs myEventArgs)
if(myEventArgs.elapsedTime >= 3 AND isConnected == false) Then
trd.Abort();
End if
End Sub
这是一个小的解决方法。
我有一个 TCP 客户端套接字,它在加载 Form1 时连接到服务器。如果连接时间太长,我需要一种方法让客户端套接字 "give up" 尝试连接到远程服务器。即 30 秒后超时。
目前,当套接字由于任何原因无法连接到服务器时,在可以访问服务器之前,表单似乎会冻结。
可能值得注意的是我正在使用 System.Net.Sockets.TcpClient()
这是用于创建连接的 My Sub:
Public serverStream As NetworkStream
Public clientSocket As New System.Net.Sockets.TcpClient()
Public Sub CreateTCPConnection()
Try
clientSocket.Connect(System.Net.IPAddress.Parse(My.Settings.ServerIP), My.Settings.ServerPort)
ConnectionStatusLbl.Text = "Connection: Connected"
ConnectionStatusPB.Image = My.Resources.LED_Green
'This should work according to MSDN but does not
clientSocket.SendTimeout = 3000
clientSocket.ReceiveTimeout = 3000
UpdateTimer.Start()
Catch ex As Exception
ConnectionStatusLbl.Text = "Connection: Not Connected"
ConnectionStatusPB.Image = My.Resources.LED_Red
clientSocket.Close()
MsgBox(ex.ToString)
End Try
End Sub
您可以线程化整个 CreateTCPConnection
函数,然后在主线程中使用 Timer
在 X 秒后中止线程,如果 public 布尔值未设置为真.
线程初始化的伪代码:
Dim isConnected as Boolean
Private Sub Form1_Load( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
isConnected = false;
trd = New Thread(AddressOf CreateTCPConnection)
trd.IsBackground = True
//Afer the start function the thread tries to connect asyncron to your server
trd.Start()
Timer timer = new Timer();
//Start the timer to check the boolean
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start()
End Sub
Private Sub CreateTCPConnection()
//Your Connection method
End Sub
//Checks the isConnected status each second. If isConnected is false and 3 seconds are reached, the thread gets aborted.
Private Sub TimerEventProcessor(Object myObject,
EventArgs myEventArgs)
if(myEventArgs.elapsedTime >= 3 AND isConnected == false) Then
trd.Abort();
End if
End Sub
这是一个小的解决方法。