# File lib/stomp/connection.rb, line 124
    def socket
      @socket_semaphore.synchronize do
        used_socket = @socket
        used_socket = nil if closed?

        while used_socket.nil? || !@failure.nil?
          @failure = nil
          begin
            used_socket = open_socket
            # Open complete

            connect(used_socket)
            if @logger && @logger.respond_to?(:on_connected)
              @logger.on_connected(log_params)
            end
            @connection_attempts = 0
          rescue
            @failure = $!
            used_socket = nil
            raise unless @reliable
            raise if @failure.is_a?(Stomp::Error::LoggerConnectionError)
            if @logger && @logger.respond_to?(:on_connectfail)
              # on_connectfail may raise
              begin
                @logger.on_connectfail(log_params)
              rescue Exception => aex
                raise if aex.is_a?(Stomp::Error::LoggerConnectionError)
              end
            else
              $stderr.print "connect to #{@host} failed: #{$!} will retry(##{@connection_attempts}) in #{@reconnect_delay}\n"
            end
            raise Stomp::Error::MaxReconnectAttempts if max_reconnect_attempts?

            sleep(@reconnect_delay)

            @connection_attempts += 1

            if @parameters
              change_host
              increase_reconnect_delay
            end
          end
        end
        @socket = used_socket
      end
    end