All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.barchart.udt.net.IceSocket Maven / Gradle / Ivy

/**
 * Copyright (C) 2009-2013 Barchart, Inc. 
 *
 * All rights reserved. Licensed under the OSI BSD License.
 *
 * http://www.opensource.org/licenses/bsd-license.php
 */
package com.barchart.udt.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.channels.SocketChannel;

/**
 * compatibility verification interface
 */
public interface IceSocket {

	/**
	 * Connects this socket to the server.
	 * 
	 * @param endpoint
	 *            the SocketAddress
	 * @throws IOException
	 *             if an error occurs during the connection
	 * @throws java.nio.channels.IllegalBlockingModeException
	 *             if this socket has an associated channel, and the channel is
	 *             in non-blocking mode
	 * @throws IllegalArgumentException
	 *             if endpoint is null or is a SocketAddress subclass not
	 *             supported by this socket
	 * @since 1.4 spec JSR-51
	 */
	void connect(SocketAddress endpoint) throws IOException;

	/**
	 * Connects this socket to the server with a specified timeout value. A
	 * timeout of zero is interpreted as an infinite timeout. The connection
	 * will then block until established or an error occurs.
	 * 
	 * @param endpoint
	 *            the SocketAddress
	 * @param timeout
	 *            the timeout value to be used in milliseconds.
	 * @throws IOException
	 *             if an error occurs during the connection
	 * @throws SocketTimeoutException
	 *             if timeout expires before connecting
	 * @throws java.nio.channels.IllegalBlockingModeException
	 *             if this socket has an associated channel, and the channel is
	 *             in non-blocking mode
	 * @throws IllegalArgumentException
	 *             if endpoint is null or is a SocketAddress subclass not
	 *             supported by this socket
	 * @since 1.4 spec JSR-51
	 */
	void connect(SocketAddress endpoint, int timeout) throws IOException;

	/**
	 * Binds the socket to a local address.
	 * 

* If the address is null, then the system will pick up an * ephemeral port and a valid local address to bind the socket. * * @param bindpoint * the SocketAddress to bind to * @throws IOException * if the bind operation fails, or if the socket is already * bound. * @throws IllegalArgumentException * if bindpoint is a SocketAddress subclass not supported by * this socket * * @since 1.4 * @see #isBound */ void bind(SocketAddress bindpoint) throws IOException; /** * Returns the address to which the socket is connected. * * @return the remote IP address to which this socket is connected, or * null if the socket is not connected. */ InetAddress getInetAddress(); /** * Gets the local address to which the socket is bound. * * @return the local address to which the socket is bound or * InetAddress.anyLocalAddress() if the socket is not * bound yet. * @since JDK1.1 */ InetAddress getLocalAddress(); /** * Returns the remote port to which this socket is connected. * * @return the remote port number to which this socket is connected, or 0 if * the socket is not connected yet. */ int getPort(); /** * Returns the local port to which this socket is bound. * * @return the local port number to which this socket is bound or -1 if the * socket is not bound yet. */ int getLocalPort(); /** * Returns the address of the endpoint this socket is connected to, or * null if it is unconnected. * * @return a SocketAddress reprensenting the remote endpoint of * this socket, or null if it is not connected yet. * @see #getInetAddress() * @see #getPort() * @see #connect(SocketAddress, int) * @see #connect(SocketAddress) * @since 1.4 */ SocketAddress getRemoteSocketAddress(); /** * Returns the address of the endpoint this socket is bound to, or * null if it is not bound yet. * * @return a SocketAddress representing the local endpoint of * this socket, or null if it is not bound yet. * @see #getLocalAddress() * @see #getLocalPort() * @see #bind(SocketAddress) * @since 1.4 */ SocketAddress getLocalSocketAddress(); /** * Returns the unique {@link java.nio.channels.SocketChannel SocketChannel} * object associated with this socket, if any. * *

* A socket will have a channel if, and only if, the channel itself was * created via the {@link java.nio.channels.SocketChannel#open * SocketChannel.open} or * {@link java.nio.channels.ServerSocketChannel#accept * ServerSocketChannel.accept} methods. * * @return the socket channel associated with this socket, or null * if this socket was not created for a channel * * @since 1.4 spec JSR-51 */ SocketChannel getChannel(); /** * Returns an input stream for this socket. * *

* If this socket has an associated channel then the resulting input stream * delegates all of its operations to the channel. If the channel is in * non-blocking mode then the input stream's read operations will * throw an {@link java.nio.channels.IllegalBlockingModeException}. * *

* Under abnormal conditions the underlying connection may be broken by the * remote host or the network software (for example a connection reset in * the case of TCP connections). When a broken connection is detected by the * network software the following applies to the returned input stream :- * *

    * *
  • *

    * The network software may discard bytes that are buffered by the socket. * Bytes that aren't discarded by the network software can be read using * {@link java.io.InputStream#read read}. * *

  • *

    * If there are no bytes buffered on the socket, or all buffered bytes have * been consumed by {@link java.io.InputStream#read read}, then all * subsequent calls to {@link java.io.InputStream#read read} will throw an * {@link java.io.IOException IOException}. * *

  • *

    * If there are no bytes buffered on the socket, and the socket has not been * closed using {@link #close close}, then * {@link java.io.InputStream#available available} will return * 0. * *

* *

* Closing the returned {@link java.io.InputStream InputStream} will close * the associated socket. * * @return an input stream for reading bytes from this socket. * @exception IOException * if an I/O error occurs when creating the input stream, the * socket is closed, the socket is not connected, or the * socket input has been shutdown using * {@link #shutdownInput()} * * revised 1.4 spec JSR-51 */ InputStream getInputStream() throws IOException; /** * Returns an output stream for this socket. * *

* If this socket has an associated channel then the resulting output stream * delegates all of its operations to the channel. If the channel is in * non-blocking mode then the output stream's write operations will * throw an {@link java.nio.channels.IllegalBlockingModeException}. * *

* Closing the returned {@link java.io.OutputStream OutputStream} will close * the associated socket. * * @return an output stream for writing bytes to this socket. * @exception IOException * if an I/O error occurs when creating the output stream or * if the socket is not connected. revised 1.4 spec JSR-51 */ OutputStream getOutputStream() throws IOException; /** * Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). * * @param on * true to enable TCP_NODELAY, false to * disable. * * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * * @since JDK1.1 * * @see #getTcpNoDelay() */ void setTcpNoDelay(boolean on) throws SocketException; /** * Tests if TCP_NODELAY is enabled. * * @return a boolean indicating whether or not TCP_NODELAY is * enabled. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since JDK1.1 * @see #setTcpNoDelay(boolean) */ boolean getTcpNoDelay() throws SocketException; /** * Enable/disable SO_LINGER with the specified linger time in seconds. The * maximum timeout value is platform specific. * * The setting only affects socket close. * * @param on * whether or not to linger on. * @param linger * how long to linger for, if on is true. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @exception IllegalArgumentException * if the linger value is negative. * @since JDK1.1 * @see #getSoLinger() */ void setSoLinger(boolean on, int linger) throws SocketException; /** * Returns setting for SO_LINGER. -1 returns implies that the option is * disabled. * * The setting only affects socket close. * * @return the setting for SO_LINGER. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since JDK1.1 * @see #setSoLinger(boolean, int) */ int getSoLinger() throws SocketException; /** * Send one byte of urgent data on the socket. The byte to be sent is the * lowest eight bits of the data parameter. The urgent byte is sent after * any preceding writes to the socket OutputStream and before any future * writes to the OutputStream. * * @param data * The byte of data to send * @exception IOException * if there is an error sending the data. * @since 1.4 */ void sendUrgentData(int data) throws IOException; /** * Enable/disable OOBINLINE (receipt of TCP urgent data) * * By default, this option is disabled and TCP urgent data received on a * socket is silently discarded. If the user wishes to receive urgent data, * then this option must be enabled. When enabled, urgent data is received * inline with normal data. *

* Note, only limited support is provided for handling incoming urgent data. * In particular, no notification of incoming urgent data is provided and * there is no capability to distinguish between normal data and urgent data * unless provided by a higher level protocol. * * @param on * true to enable OOBINLINE, false to * disable. * * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * * @since 1.4 * * @see #getOOBInline() */ void setOOBInline(boolean on) throws SocketException; /** * Tests if OOBINLINE is enabled. * * @return a boolean indicating whether or not OOBINLINE is * enabled. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since 1.4 * @see #setOOBInline(boolean) */ boolean getOOBInline() throws SocketException; /** * Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. * With this option set to a non-zero timeout, a read() call on the * InputStream associated with this Socket will block for only this amount * of time. If the timeout expires, a java.net.SocketTimeoutException * is raised, though the Socket is still valid. The option must be * enabled prior to entering the blocking operation to have effect. The * timeout must be > 0. A timeout of zero is interpreted as an infinite * timeout. * * @param timeout * the specified timeout, in milliseconds. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since JDK 1.1 * @see #getSoTimeout() */ void setSoTimeout(int timeout) throws SocketException; /** * Returns setting for SO_TIMEOUT. 0 returns implies that the option is * disabled (i.e., timeout of infinity). * * @return the setting for SO_TIMEOUT * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since JDK1.1 * @see #setSoTimeout(int) */ int getSoTimeout() throws SocketException; /** * Sets the SO_SNDBUF option to the specified value for this Socket * . The SO_SNDBUF option is used by the platform's networking code as a * hint for the size to set the underlying network I/O buffers. * *

* Because SO_SNDBUF is a hint, applications that want to verify what size * the buffers were set to should call {@link #getSendBufferSize()}. * * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * * @param size * the size to which to set the send buffer size. This value must * be greater than 0. * * @exception IllegalArgumentException * if the value is 0 or is negative. * * @see #getSendBufferSize() * @since 1.2 */ void setSendBufferSize(int size) throws SocketException; /** * Get value of the SO_SNDBUF option for this Socket, that is the * buffer size used by the platform for output on this Socket. * * @return the value of the SO_SNDBUF option for this Socket. * * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * * @see #setSendBufferSize(int) * @since 1.2 */ int getSendBufferSize() throws SocketException; /** * Sets the SO_RCVBUF option to the specified value for this Socket * . The SO_RCVBUF option is used by the platform's networking code as a * hint for the size to set the underlying network I/O buffers. * *

* Increasing the receive buffer size can increase the performance of * network I/O for high-volume connection, while decreasing it can help * reduce the backlog of incoming data. * *

* Because SO_RCVBUF is a hint, applications that want to verify what size * the buffers were set to should call {@link #getReceiveBufferSize()}. * *

* The value of SO_RCVBUF is also used to set the TCP receive window that is * advertized to the remote peer. Generally, the window size can be modified * at any time when a socket is connected. However, if a receive window * larger than 64K is required then this must be requested before the * socket is connected to the remote peer. There are two cases to be aware * of: *

*

    *
  1. For sockets accepted from a ServerSocket, this must be done by * calling {@link ServerSocket#setReceiveBufferSize(int)} before the * ServerSocket is bound to a local address. *

  2. *
  3. For client sockets, setReceiveBufferSize() must be called before * connecting the socket to its remote peer. *

  4. *
* * @param size * the size to which to set the receive buffer size. This value * must be greater than 0. * * @exception IllegalArgumentException * if the value is 0 or is negative. * * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * * @see #getReceiveBufferSize() * @see ServerSocket#setReceiveBufferSize(int) * @since 1.2 */ void setReceiveBufferSize(int size) throws SocketException; /** * Gets the value of the SO_RCVBUF option for this Socket, that is * the buffer size used by the platform for input on this Socket. * * @return the value of the SO_RCVBUF option for this Socket. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @see #setReceiveBufferSize(int) * @since 1.2 */ int getReceiveBufferSize() throws SocketException; /** * Enable/disable SO_KEEPALIVE. * * @param on * whether or not to have socket keep alive turned on. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since 1.3 * @see #getKeepAlive() */ void setKeepAlive(boolean on) throws SocketException; /** * Tests if SO_KEEPALIVE is enabled. * * @return a boolean indicating whether or not SO_KEEPALIVE is * enabled. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since 1.3 * @see #setKeepAlive(boolean) */ boolean getKeepAlive() throws SocketException; /** * Sets traffic class or type-of-service octet in the IP header for packets * sent from this Socket. As the underlying network implementation may * ignore this value applications should consider it a hint. * *

* The tc must be in the range 0 <= tc <= * 255 or an IllegalArgumentException will be thrown. *

* Notes: *

* For Internet Protocol v4 the value consists of an octet with precedence * and TOS fields as detailed in RFC 1349. The TOS field is bitset created * by bitwise-or'ing values such the following :- *

*

    *
  • IPTOS_LOWCOST (0x02)
  • *
  • IPTOS_RELIABILITY (0x04)
  • *
  • IPTOS_THROUGHPUT (0x08)
  • *
  • IPTOS_LOWDELAY (0x10)
  • *
* The last low order bit is always ignored as this corresponds to the MBZ * (must be zero) bit. *

* Setting bits in the precedence field may result in a SocketException * indicating that the operation is not permitted. *

* As RFC 1122 section 4.2.4.2 indicates, a compliant TCP implementation * should, but is not required to, let application change the TOS field * during the lifetime of a connection. So whether the type-of-service field * can be changed after the TCP connection has been established depends on * the implementation in the underlying platform. Applications should not * assume that they can change the TOS field after the connection. *

* For Internet Protocol v6 tc is the value that would be * placed into the sin6_flowinfo field of the IP header. * * @param tc * an int value for the bitset. * @throws SocketException * if there is an error setting the traffic class or * type-of-service * @since 1.4 * @see #getTrafficClass */ void setTrafficClass(int tc) throws SocketException; /** * Gets traffic class or type-of-service in the IP header for packets sent * from this Socket *

* As the underlying network implementation may ignore the traffic class or * type-of-service set using {@link #setTrafficClass(int)} this method may * return a different value than was previously set using the * {@link #setTrafficClass(int)} method on this Socket. * * @return the traffic class or type-of-service already set * @throws SocketException * if there is an error obtaining the traffic class or * type-of-service value. * @since 1.4 * @see #setTrafficClass(int) */ int getTrafficClass() throws SocketException; /** * Enable/disable the SO_REUSEADDR socket option. *

* When a TCP connection is closed the connection may remain in a timeout * state for a period of time after the connection is closed (typically * known as the TIME_WAIT state or 2MSL wait state). For * applications using a well known socket address or port it may not be * possible to bind a socket to the required SocketAddress if there * is a connection in the timeout state involving the socket address or * port. *

* Enabling SO_REUSEADDR prior to binding the socket using * {@link #bind(SocketAddress)} allows the socket to be bound even though a * previous connection is in a timeout state. *

* When a Socket is created the initial setting of * SO_REUSEADDR is disabled. *

* The behaviour when SO_REUSEADDR is enabled or disabled after a * socket is bound (See {@link #isBound()}) is not defined. * * @param on * whether to enable or disable the socket option * @exception SocketException * if an error occurs enabling or disabling the * SO_RESUEADDR socket option, or the socket is * closed. * @since 1.4 * @see #getReuseAddress() * @see #bind(SocketAddress) * @see #isClosed() * @see #isBound() */ void setReuseAddress(boolean on) throws SocketException; /** * Tests if SO_REUSEADDR is enabled. * * @return a boolean indicating whether or not SO_REUSEADDR is * enabled. * @exception SocketException * if there is an error in the underlying protocol, such as a * TCP error. * @since 1.4 * @see #setReuseAddress(boolean) */ boolean getReuseAddress() throws SocketException; /** * Closes this socket. *

* Any thread currently blocked in an I/O operation upon this socket will * throw a {@link SocketException}. *

* Once a socket has been closed, it is not available for further networking * use (i.e. can't be reconnected or rebound). A new socket needs to be * created. * *

* Closing this socket will also close the socket's * {@link java.io.InputStream InputStream} and {@link java.io.OutputStream * OutputStream}. * *

* If this socket has an associated channel then the channel is closed as * well. * * @exception IOException * if an I/O error occurs when closing this socket. revised * 1.4 spec JSR-51 * @see #isClosed */ void close() throws IOException; /** * Places the input stream for this socket at "end of stream". Any data sent * to the input stream side of the socket is acknowledged and then silently * discarded. *

* If you read from a socket input stream after invoking shutdownInput() on * the socket, the stream will return EOF. * * @exception IOException * if an I/O error occurs when shutting down this socket. * * @since 1.3 * @see java.net.Socket#shutdownOutput() * @see java.net.Socket#close() * @see java.net.Socket#setSoLinger(boolean, int) * @see #isInputShutdown */ void shutdownInput() throws IOException; /** * Disables the output stream for this socket. For a TCP socket, any * previously written data will be sent followed by TCP's normal connection * termination sequence. * * If you write to a socket output stream after invoking shutdownOutput() on * the socket, the stream will throw an IOException. * * @exception IOException * if an I/O error occurs when shutting down this socket. * * @since 1.3 * @see java.net.Socket#shutdownInput() * @see java.net.Socket#close() * @see java.net.Socket#setSoLinger(boolean, int) * @see #isOutputShutdown */ void shutdownOutput() throws IOException; /** * Converts this socket to a String. * * @return a string representation of this socket. */ @Override String toString(); /** * Returns the connection state of the socket. * * @return true if the socket successfuly connected to a server * @since 1.4 */ boolean isConnected(); /** * Returns the binding state of the socket. * * @return true if the socket successfuly bound to an address * @since 1.4 * @see #bind */ boolean isBound(); /** * Returns the closed state of the socket. * * @return true if the socket has been closed * @since 1.4 * @see #close */ boolean isClosed(); /** * Returns whether the read-half of the socket connection is closed. * * @return true if the input of the socket has been shutdown * @since 1.4 * @see #shutdownInput */ boolean isInputShutdown(); /** * Returns whether the write-half of the socket connection is closed. * * @return true if the output of the socket has been shutdown * @since 1.4 * @see #shutdownOutput */ boolean isOutputShutdown(); /** * Sets performance preferences for this socket. * *

* Sockets use the TCP/IP protocol by default. Some implementations may * offer alternative protocols which have different performance * characteristics than TCP/IP. This method allows the application to * express its own preferences as to how these tradeoffs should be made when * the implementation chooses from the available protocols. * *

* Performance preferences are described by three integers whose values * indicate the relative importance of short connection time, low latency, * and high bandwidth. The absolute values of the integers are irrelevant; * in order to choose a protocol the values are simply compared, with larger * values indicating stronger preferences. Negative values represent a lower * priority than positive values. If the application prefers short * connection time over both low latency and high bandwidth, for example, * then it could invoke this method with the values (1, 0, 0). If * the application prefers high bandwidth above low latency, and low latency * above short connection time, then it could invoke this method with the * values (0, 1, 2). * *

* Invoking this method after this socket has been connected will have no * effect. * * @param connectionTime * An int expressing the relative importance of a short * connection time * * @param latency * An int expressing the relative importance of low * latency * * @param bandwidth * An int expressing the relative importance of high * bandwidth * * @since 1.5 */ void setPerformancePreferences(int connectionTime, int latency, int bandwidth); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy