Class OncRpcTcpSocketHelper

java.lang.Object
org.acplt.oncrpc.OncRpcTcpSocketHelper

public class OncRpcTcpSocketHelper extends Object
Wraps JRE-specific networking code for TCP/IP-based client sockets. So much for compile once, make it unuseable everywhere. Why could our great Sun simply not get their socket class straight from the beginning? The BSD socket API has been around since long enough and that real network applications need to control certain aspects of the transport layer's behaviour was also well known at this time -- looks like the one exceptions was -- and still is -- Sun, and the second one is MS.

Sun always toutes Java as the perfect network "whatever" (replace with buzzword-of-the-day, like "programming language", "operating system",...) and especially their support for the Web. Sweet irony that it took them until JRE 1.3 to realize that half-closed connections are the way to do HTTP/1.0 non-persistent connections. And even more irony that they are now beginning to understand about polled network i/o.

The following JRE-dependent methods are wrapped and will just do nothing or return fake information on old JRE plattforms. The number after each method wrapper indicates the first JRE version supporting a particular feature:

  • setSendBufferSize() -- 1.2
  • setReceiveBufferSize() -- 1.2
  • The following methods have been around since JDK 1.1, so we do not need to wrap them as we will never support JDK 1.0 -- let it rest in piece(s):

    • getTcpNoDelay() / setTcpNoDelay()
    • getSoTimeout() / setSoTimeout()

    In order to support connect() timeouts before JDK 1.4, there's now a connect() method available. It is more than just a simple wrapper for pre JDK 1.4.

    Version:
    $Revision: 1.3 $ $Date: 2007/05/29 19:45:46 $ $State: Exp $ $Locker: $
    Author:
    Harald Albrecht
    • Nested Class Summary

      Nested Classes
      Modifier and Type
      Class
      Description
      private class 
      The class Connectiator has a short and sometimes sad life, as its only purpose is trying to connect to a TCP port at another host machine.
    • Field Summary

      Fields
      Modifier and Type
      Field
      Description
      private Constructor
      Constructor Socket() without any parameters or null if not available in the class library of a particular JRE.
      private Method
      Method Socket.connect with timeout or null if not available in the class library of a particular JRE.
      private Method
      Method Socket.getReceiveBufferSize or null if not available in the class library of a particular JRE.
      private Method
      Method Socket.getSendBufferSize or null if not available in the class library of a particular JRE.
      private Method
      Method Socket.setReceiverBufferSize or null if not available in the class library of a particular JRE.
      private Method
      Method Socket.setSendBufferSize or null if not available in the class library of a particular JRE.
      private Socket
      The socket for which we have to help out with some missing methods.
    • Constructor Summary

      Constructors
      Constructor
      Description
      Creates a stream socket helper but does not associates it with a real stream socket object.
      Creates a stream socket helper and associates it with the given stream-based socket.
    • Method Summary

      Modifier and Type
      Method
      Description
      connect(InetAddress address, int port, int timeout)
      Connects to specified TCP port at given host address, but aborts after timeout milliseconds if the connection could not be established within this time frame.
      int
      Get size of receive buffer for this socket.
      int
      Get size of send buffer for this socket.
      protected void
      Looks up methods of class Socket whether they are supported by the class libraries of the JRE we are currently executing on.
      void
      Sets the socket's receive buffer size as a hint to the underlying transport layer to use appropriately sized I/O buffers.
      void
      Sets the socket's send buffer size as a hint to the underlying transport layer to use appropriately sized I/O buffers.

      Methods inherited from class java.lang.Object

      clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Details

      • socket

        private Socket socket
        The socket for which we have to help out with some missing methods.
      • methodSetSendBufferSize

        private Method methodSetSendBufferSize
        Method Socket.setSendBufferSize or null if not available in the class library of a particular JRE.
      • methodSetReceiveBufferSize

        private Method methodSetReceiveBufferSize
        Method Socket.setReceiverBufferSize or null if not available in the class library of a particular JRE.
      • methodGetSendBufferSize

        private Method methodGetSendBufferSize
        Method Socket.getSendBufferSize or null if not available in the class library of a particular JRE.
      • methodGetReceiveBufferSize

        private Method methodGetReceiveBufferSize
        Method Socket.getReceiveBufferSize or null if not available in the class library of a particular JRE.
      • methodConnect

        private Method methodConnect
        Method Socket.connect with timeout or null if not available in the class library of a particular JRE.
      • ctor

        private Constructor ctor
        Constructor Socket() without any parameters or null if not available in the class library of a particular JRE.
    • Constructor Details

      • OncRpcTcpSocketHelper

        public OncRpcTcpSocketHelper(Socket socket)
        Creates a stream socket helper and associates it with the given stream-based socket.
        Parameters:
        socket - The socket associated with this helper.
      • OncRpcTcpSocketHelper

        public OncRpcTcpSocketHelper()
        Creates a stream socket helper but does not associates it with a real stream socket object. You need to call connect(java.net.InetAddress, int, int) lateron for a timeout-controlled connect.
    • Method Details

      • connect

        public Socket connect(InetAddress address, int port, int timeout) throws IOException
        Connects to specified TCP port at given host address, but aborts after timeout milliseconds if the connection could not be established within this time frame.

        On pre-JRE 1.4 systems, this method will create a new thread to handle connection establishment. This should be no problem, as in general you might not want to connect to many ONC/RPC servers at the same time; but surely someone will soon pop up with a perfect reason just to do so...

        Parameters:
        timeout - Timeout in milliseconds for connection operation. A negative timeout leaves the exact timeout up to the particular JVM and java.net implementation.
        Throws:
        IOException - with the message "connect interrupted" in case the timeout was reached before the connection could be established.
      • setSendBufferSize

        public void setSendBufferSize(int size) throws SocketException
        Sets the socket's send buffer size as a hint to the underlying transport layer to use appropriately sized I/O buffers. If the class libraries of the underlying JRE do not support setting the send buffer size, this is silently ignored.
        Parameters:
        size - The size to which to set the send buffer size. This value must be greater than 0.
        Throws:
        SocketException - if the socket's send buffer size could not be set, because the transport layer decided against accepting the new buffer size.
        IllegalArgumentException - if size is 0 or negative.
      • getSendBufferSize

        public int getSendBufferSize() throws SocketException
        Get size of send buffer for this socket.
        Returns:
        Size of send buffer.
        Throws:
        SocketException - If the transport layer could not be queried for the size of this socket's send buffer.
      • setReceiveBufferSize

        public void setReceiveBufferSize(int size) throws SocketException
        Sets the socket's receive buffer size as a hint to the underlying transport layer to use appropriately sized I/O buffers. If the class libraries of the underlying JRE do not support setting the receive buffer size, this is silently ignored.
        Parameters:
        size - The size to which to set the receive buffer size. This value must be greater than 0.
        Throws:
        SocketException - if the socket's receive buffer size could not be set, because the transport layer decided against accepting the new buffer size.
        IllegalArgumentException - if size is 0 or negative.
      • getReceiveBufferSize

        public int getReceiveBufferSize() throws SocketException
        Get size of receive buffer for this socket.
        Returns:
        Size of receive buffer.
        Throws:
        SocketException - If the transport layer could not be queried for the size of this socket's receive buffer.
      • inspectSocketClassMethods

        protected void inspectSocketClassMethods()
        Looks up methods of class Socket whether they are supported by the class libraries of the JRE we are currently executing on.