【问题标题】:How reconnect clients sockets to my server if my server restarts如果我的服务器重新启动,如何将客户端套接字重新连接到我的服务器
【发布时间】:2017-12-11 03:22:30
【问题描述】:

我正在尝试使用套接字建立客户端-服务器连接。

它基本上工作得很好;只有一个问题是当我在服务器计算机上关闭并重新打开我的服务器时,客户端不会重新连接

这是我的客户代码:

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

【问题讨论】:

    标签: vb.net sockets tcp server client


    【解决方案1】:

    @亚历山大·希金斯 我尝试过这样的事情,但似乎 SocketException 仅在第一次打开服务器之前发生。如果我关闭服务器并重新打开它,它不会 catch 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
    

    【讨论】:

      【解决方案2】:

      您的客户端需要处理断开连接并在需要时重新连接。

      要完成此操作,您可以捕获 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      
      

      【讨论】:

      • 很抱歉我是菜鸟,但处理断开连接的最佳方法是什么
      • 就像说的那样,在你的 try catch 语句中,如果适用,调用 DoReconnect()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2018-02-10
      • 2015-11-20
      • 1970-01-01
      • 2018-05-24
      • 2011-04-16
      相关资源
      最近更新 更多