Comment reconnecter les sockets clients à mon serveur si mon serveur redémarre

J’essaie de faire une connexion client-serveur en utilisant des sockets.

En gros, ça marche plutôt bien. un seul problème est lorsque je ferme et rouvre mon serveur sur le serveur, les clients ne se reconnecteront pas

Ceci est mon code client:

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 Ssortingng = "computer name" Dim KEY As Ssortingng = "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 SsortingngToByte(ByVal STR As Ssortingng) As Byte() Return System.Text.Encoding.Default.GetBytes(STR) End Function Public Shared Function ByteToSsortingng(ByVal BYS As Byte()) As Ssortingng Return System.Text.Encoding.Default.GetSsortingng(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 Ssortingng = Data.Sender Dim Arr As Ssortingng() = Split(System.Text.Encoding.Default.GetSsortingng(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.GetSsortingng(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.ToSsortingng() 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 Ssortingng) 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 Ssortingng Public clientSocket As Socket Public Message As Byte() End Class Public Class ClientConnectedEventArgs Inherits EventArgs Public clientID As Ssortingng Public clientSocket As Socket End Class 

Votre client doit gérer les déconnexions et se reconnecter si nécessaire.

Pour ce faire, vous pouvez intercepter une SocketException et voir pourquoi le socket a été fermé.

Selon l’exception, vous pouvez exécuter une méthode pour que votre client se reconnecte.

 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.ToSsortingng()) Exit Do End Try System.Threading.Thread.Sleep(SecondsToWait*1000) SecondsToWait <<=1 ' Exponential Back Off Time Loop End Sub 

@Alexander Higgins J’ai essayé quelque chose comme ça, mais il semble que SocketException ne se produit que lorsque vous ouvrez le serveur pour la première fois .

  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