Class AbstractConnection

  • All Implemented Interfaces:
    java.lang.Runnable
    Direct Known Subclasses:
    OtpConnection, OtpCookedConnection

    public abstract class AbstractConnection
    extends java.lang.Thread
    Maintains a connection between a Java process and a remote Erlang, Java or C node. The object maintains connection state and allows data to be sent to and received from the peer.

    This abstract class provides the necessary methods to maintain the actual connection and encode the messages and headers in the proper format according to the Erlang distribution protocol. Subclasses can use these methods to provide a more or less transparent communication channel as desired.

    Note that no receive methods are provided. Subclasses must provide methods for message delivery, and may implement their own receive methods.

    If an exception occurs in any of the methods in this class, the connection will be closed and must be reopened in order to resume communication with the peer. This will be indicated to the subclass by passing the exception to its delivery() method.

    The System property OtpConnection.trace can be used to change the initial trace level setting for all connections. Normally the initial trace level is 0 and connections are not traced unless setTraceLevel() is used to change the setting for a particular connection. OtpConnection.trace can be used to turn on tracing by default for all connections.

    • Constructor Detail

      • AbstractConnection

        protected AbstractConnection​(OtpLocalNode self,
                                     OtpTransport s)
                              throws java.io.IOException,
                                     OtpAuthException
        Accept an incoming connection from a remote node. Used by OtpSelf.accept() to create a connection based on data received when handshaking with the peer node, when the remote node is the connection initiator.
        Throws:
        java.io.IOException - if it was not possible to connect to the peer.
        OtpAuthException - if handshake resulted in an authentication error
      • AbstractConnection

        protected AbstractConnection​(OtpLocalNode self,
                                     OtpPeer other)
                              throws java.io.IOException,
                                     OtpAuthException
        Intiate and open a connection to a remote node.
        Throws:
        java.io.IOException - if it was not possible to connect to the peer.
        OtpAuthException - if handshake resulted in an authentication error.
    • Method Detail

      • deliver

        public abstract void deliver​(java.lang.Exception e)
        Deliver communication exceptions to the recipient.
      • deliver

        public abstract void deliver​(OtpMsg msg)
        Deliver messages to the recipient.
      • sendBuf

        protected void sendBuf​(OtpErlangPid from,
                               java.lang.String dest,
                               OtpOutputStream payload)
                        throws java.io.IOException
        Send a pre-encoded message to a named process on a remote node.
        Parameters:
        dest - the name of the remote process.
        payload - the encoded message to send.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • sendBuf

        protected void sendBuf​(OtpErlangPid from,
                               OtpErlangPid dest,
                               OtpOutputStream payload)
                        throws java.io.IOException
        Send a pre-encoded message to a process on a remote node.
        Parameters:
        dest - the Erlang PID of the remote process.
        payload - the encoded message to send.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • sendLink

        protected void sendLink​(OtpErlangPid from,
                                OtpErlangPid dest)
                         throws java.io.IOException
        Send link signal to remote process.
        Parameters:
        dest - the Erlang PID of the remote process.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • sendUnlink

        protected void sendUnlink​(OtpErlangPid from,
                                  OtpErlangPid dest,
                                  long unlink_id)
                           throws java.io.IOException
        Send unlink signal to remote process.
        Parameters:
        dest - the Erlang PID of the remote process.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • sendUnlinkAck

        protected void sendUnlinkAck​(OtpErlangPid from,
                                     OtpErlangPid dest,
                                     long unlink_id)
                              throws java.io.IOException
        Send unlink acknowledgment signal to remote process.
        Parameters:
        dest - the Erlang PID of the remote process.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • sendExit2

        protected void sendExit2​(OtpErlangPid from,
                                 OtpErlangPid dest,
                                 OtpErlangObject reason)
                          throws java.io.IOException
        Send an exit signal to a remote process.
        Parameters:
        dest - the Erlang PID of the remote process.
        reason - an Erlang term describing the exit reason.
        Throws:
        java.io.IOException - if the connection is not active or a communication error occurs.
      • run

        public void run()
        Specified by:
        run in interface java.lang.Runnable
        Overrides:
        run in class java.lang.Thread
      • setTraceLevel

        public int setTraceLevel​(int level)

        Set the trace level for this connection. Normally tracing is off by default unless System property OtpConnection.trace was set.

        The following levels are valid: 0 turns off tracing completely, 1 shows ordinary send and receive messages, 2 shows control messages such as link and unlink, 3 shows handshaking at connection setup, and 4 shows communication with Epmd. Each level includes the information shown by the lower ones.

        Parameters:
        level - the level to set.
        Returns:
        the previous trace level.
      • getTraceLevel

        public int getTraceLevel()
        Get the trace level for this connection.
        Returns:
        the current trace level.
      • close

        public void close()
        Close the connection to the remote node.
      • finalize

        protected void finalize()
        Overrides:
        finalize in class java.lang.Object
      • isConnected

        public boolean isConnected()
        Determine if the connection is still alive. Note that this method only reports the status of the connection, and that it is possible that there are unread messages waiting in the receive queue.
        Returns:
        true if the connection is alive.
      • do_send

        protected void do_send​(OtpOutputStream header)
                        throws java.io.IOException
        Throws:
        java.io.IOException
      • headerType

        protected java.lang.String headerType​(OtpErlangObject h)
      • readSock

        protected int readSock​(OtpTransport s,
                               byte[] b)
                        throws java.io.IOException
        Throws:
        java.io.IOException
      • genChallenge

        protected static int genChallenge()
      • genDigest

        protected byte[] genDigest​(int challenge,
                                   java.lang.String cookie)
      • sendName

        protected int sendName​(int dist,
                               long aflags,
                               int creation)
                        throws java.io.IOException
        Throws:
        java.io.IOException
      • sendChallenge

        protected void sendChallenge​(long her_flags,
                                     long our_flags,
                                     int challenge)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • recvName

        protected int recvName​(OtpPeer apeer)
                        throws java.io.IOException
        Throws:
        java.io.IOException
      • recvChallenge

        protected int recvChallenge()
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • sendChallengeReply

        protected void sendChallengeReply​(int challenge,
                                          byte[] digest)
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • recvChallengeReply

        protected int recvChallengeReply​(int our_challenge)
                                  throws java.io.IOException,
                                         OtpAuthException
        Throws:
        java.io.IOException
        OtpAuthException
      • sendChallengeAck

        protected void sendChallengeAck​(byte[] digest)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • recvChallengeAck

        protected void recvChallengeAck​(int our_challenge)
                                 throws java.io.IOException,
                                        OtpAuthException
        Throws:
        java.io.IOException
        OtpAuthException
      • sendStatus

        protected void sendStatus​(java.lang.String status)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • recvStatus

        protected void recvStatus()
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • setFlags

        public void setFlags​(int flags)
      • getFlags

        public int getFlags()