2017-07-06 13 views
2

我正在嘗試使用套接字進行客戶端 - 服務器連接。如果我的服務器重新啓動,如何將客戶端套接字重新連接到我的服務器

它基本上工作得很好;只有一個問題是,當我關閉並重新打開我的服務器計算機上的服務器的客戶端將無法重新連接

這是我的客戶端代碼:

Imports System.Net.Sockets 
Imports System.Threading 
Imports System.IO 
Public Class Form1 
     Public Delegate Sub MessageReceivedEventHandler(ByVal sender As Object, ByVal e As MessageReceivedEventArgs) 
     Public Delegate Sub ClientConnectedEventHandler(ByVal sender As Object, ByVal e As ClientConnectedEventArgs) 
     Public Event MessageReceived As MessageReceivedEventHandler 
     Public Event ClientConnected As ClientConnectedEventHandler 
     Public Buffer As Byte() 
     Public Shared Client As TcpClient 
     Dim Port As Integer = 5050 
    Dim host As String = "computer name" 
    Dim KEY As String = "mykey" 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim T As New Thread(AddressOf run) 
     T.Start() 
    End Sub 


    Private Sub run() 
     ' Connect to the server' 
     Client = New TcpClient(host, Port) 
     Dim T As New Thread(AddressOf Receiver, 10) 
     T.Start() 
    End Sub 

    Public Shared Function StringToByte(ByVal STR As String) As Byte() 
     Return System.Text.Encoding.Default.GetBytes(STR) 
    End Function 
    Public Shared Function ByteToString(ByVal BYS As Byte()) As String 
     Return System.Text.Encoding.Default.GetString(BYS) 
    End Function 
    Public Sub Data(ByVal Sender As Object, ByVal Data As MessageReceivedEventArgs) Handles Me.MessageReceived 
     Dim info As Byte() = Data.Message 
     Dim Client As Socket = Data.clientSocket 
     Dim ID As String = Data.Sender 
     Dim Arr As String() = Split(System.Text.Encoding.Default.GetString(info), "mykey") 
     Try 
      Select Case Arr(0) 

       Case "MSG" 
       MsgBox(Arr(1)) 
          End Select 
     Catch ex As Exception 
      MsgBox("Error Detected in Data Client :" & ex.Message) 
     End Try 
    End Sub 

    Sub Receiver() 
     Dim M As New MemoryStream 
     Try 
       If Client.Available > 0 Then 
        ReDim Buffer(Client.Available - 1) 
        Client.Client.Receive(Buffer, 0, Buffer.Length, SocketFlags.None) 
        M.Write(Buffer, 0, Buffer.Length) 
        If System.Text.Encoding.Default.GetString(M.ToArray).Contains("EOF") Then 
         Dim Data As Byte() = (M.ToArray).Remove(ConfigTcp.ENDOFPACKET) 
         Dim Msg As New MessageReceivedEventArgs 
         Msg.Message = Data 
         Msg.clientSocket = Client.Client 
         Msg.Sender = Client.Client.Handle.ToString() 
         RaiseEvent MessageReceived(Me, Msg) 
         M.Dispose() 
         M = New MemoryStream 
        End If 
       End If 
       Thread.Sleep(1) 
     Catch ex As Exception 
      MsgBox("Error Detected :" & ex.Message) 
     End Try 
    End Sub 
    Public Shared Sub Send(ByVal sock As Socket, ByVal s As String) 
      Send(sock, System.Text.Encoding.UTF8.GetBytes(s)) 
     End Sub 
     Private Shared Sub Send(ByVal sock As Socket, ByVal b As Byte()) 
      Try 
       Dim Memory As MemoryStream = New MemoryStream 
       Dim CB As Byte() = b 
       Memory.Write(CB, 0, CB.Length) 
       Memory.Write(ConfigTcp.ENDOFPACKET, 0, ConfigTcp.ENDOFPACKET.Length) 
       sock.Send(Memory.ToArray, 0, Memory.Length, SocketFlags.None) 
       Memory.Dispose() 
      Catch x As Exception 
      End Try 
     End Sub 
    End Class 
    Public Class MessageReceivedEventArgs 
     Inherits EventArgs 
     Public Sender As String 
     Public clientSocket As Socket 
     Public Message As Byte() 
    End Class 
    Public Class ClientConnectedEventArgs 
     Inherits EventArgs 
     Public clientID As String 
     Public clientSocket As Socket 
    End Class 

回答

0

您的客戶端需要處理斷開連接,並在需要時重新連接。

要完成此操作,您可以捕獲SocketException並查看套接字爲何關閉。

根據異常情況,您可以運行一種方法讓客戶端重新連接。

Public Sub DoReconnect() 
    Dim SecondsToWait as Integer=1 
    Do 
     Try 
      Client = New TcpClient(host, Port) 
      Exit Do 
     Catch SockEx as SocketException 
      'TODO: decide whether to attempt reconnection or exit 
     Catch Ex as Exception 
      'TODO: Most likely should terminate the program here 
      Console.WriteLine(Ex.ToString()) 
      Exit Do 
     End Try 
     System.Threading.Thread.Sleep(SecondsToWait*1000) 
     SecondsToWait <<=1 ' Exponential Back Off Time 
    Loop 
End Sub  
+0

對不起,我是菜鳥,但什麼是處理斷開 – ranger003

+0

就像是說最好的方式,在你嘗試catch語句,在適用情況下,調用DoReconnect() –

0

@Alexander希金斯 我想是這樣的,但似乎SocketException只發生打開服務器的時間。如果第一次之前我關閉服務器並重新打開它,它不趕上SocketException

Public Sub DoReconnect() 
    re: 
      Thread.Sleep(1000) 
      Try 
       Client = New TcpClient(host, Port) 
       Dim T As New Thread(AddressOf Receiver, 10) 
       T.IsBackground = True 
       T.Start() 
      Catch SockEx As SocketException 
       MsgBox("SocketException " + SockEx.Message) 
       GoTo re 

      Catch Ex As Exception 
       MsgBox("Exception " + Ex.Message) 

      End Try 


     End Sub 
     Private Sub run() 
      DoReconnect() 
     End Sub 
相關問題