📄 socket.java
字号:
if (! (endpoint instanceof InetSocketAddress)) throw new IllegalArgumentException("unsupported address type"); // The Sun spec says that if we have an associated channel and // it is in non-blocking mode, we throw an IllegalBlockingModeException. // However, in our implementation if the channel itself initiated this // operation, then we must honor it regardless of its blocking mode. if (getChannel() != null && ! getChannel().isBlocking() && ! ((PlainSocketImpl) getImpl()).isInChannelOperation()) throw new IllegalBlockingModeException(); if (! isBound()) bind(null); getImpl().connect(endpoint, timeout); } /** * Returns the address of the remote end of the socket. If this socket * is not connected, then <code>null</code> is returned. * * @return The remote address this socket is connected to */ public InetAddress getInetAddress() { if (! isConnected()) return null; try { return getImpl().getInetAddress(); } catch (SocketException e) { // This cannot happen as we are connected. } return null; } /** * Returns the local address to which this socket is bound. If this socket * is not connected, then a wildcard address, for which * @see InetAddress#isAnyLocalAddress() is <code>true</code>, is returned. * * @return The local address * * @since 1.1 */ public InetAddress getLocalAddress() { if (! isBound()) return InetAddress.ANY_IF; InetAddress addr = null; try { addr = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR); } catch (SocketException e) { // (hopefully) shouldn't happen // throw new java.lang.InternalError // ("Error in PlainSocketImpl.getOption"); return null; } // FIXME: According to libgcj, checkConnect() is supposed to be called // before performing this operation. Problems: 1) We don't have the // addr until after we do it, so we do a post check. 2). The docs I // see don't require this in the Socket case, only DatagramSocket, but // we'll assume they mean both. SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkConnect(addr.getHostName(), getLocalPort()); return addr; } /** * Returns the port number of the remote end of the socket connection. If * this socket is not connected, then 0 is returned. * * @return The remote port this socket is connected to */ public int getPort() { if (! isConnected()) return 0; try { return getImpl().getPort(); } catch (SocketException e) { // This cannot happen as we are connected. } return 0; } /** * Returns the local port number to which this socket is bound. If this * socket is not connected, then -1 is returned. * * @return The local port */ public int getLocalPort() { if (! isBound()) return -1; try { if (getImpl() != null) return getImpl().getLocalPort(); } catch (SocketException e) { // This cannot happen as we are bound. } return -1; } /** * Returns local socket address. * * @return the local socket address, null if not bound * * @since 1.4 */ public SocketAddress getLocalSocketAddress() { if (! isBound()) return null; InetAddress addr = getLocalAddress(); try { return new InetSocketAddress(addr, getImpl().getLocalPort()); } catch (SocketException e) { // This cannot happen as we are bound. return null; } } /** * Returns the remote socket address. * * @return the remote socket address, null of not connected * * @since 1.4 */ public SocketAddress getRemoteSocketAddress() { if (! isConnected()) return null; try { return new InetSocketAddress(getImpl().getInetAddress(), getImpl().getPort()); } catch (SocketException e) { // This cannot happen as we are connected. return null; } } /** * Returns an InputStream for reading from this socket. * * @return The InputStream object * * @exception IOException If an error occurs or Socket is not connected */ public InputStream getInputStream() throws IOException { if (isClosed()) throw new SocketException("socket is closed"); if (! isConnected()) throw new IOException("not connected"); return getImpl().getInputStream(); } /** * Returns an OutputStream for writing to this socket. * * @return The OutputStream object * * @exception IOException If an error occurs or Socket is not connected */ public OutputStream getOutputStream() throws IOException { if (isClosed()) throw new SocketException("socket is closed"); if (! isConnected()) throw new IOException("not connected"); return getImpl().getOutputStream(); } /** * Sets the TCP_NODELAY option on the socket. * * @param on true to enable, false to disable * * @exception SocketException If an error occurs or Socket is not connected * * @since 1.1 */ public void setTcpNoDelay(boolean on) throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); getImpl().setOption(SocketOptions.TCP_NODELAY, Boolean.valueOf(on)); } /** * Tests whether or not the TCP_NODELAY option is set on the socket. * Returns true if enabled, false if disabled. When on it disables the * Nagle algorithm which means that packets are always send immediatly and * never merged together to reduce network trafic. * * @return Whether or not TCP_NODELAY is set * * @exception SocketException If an error occurs or Socket not connected * * @since 1.1 */ public boolean getTcpNoDelay() throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); Object on = getImpl().getOption(SocketOptions.TCP_NODELAY); if (on instanceof Boolean) return (((Boolean) on).booleanValue()); else throw new SocketException("Internal Error"); } /** * Sets the value of the SO_LINGER option on the socket. If the * SO_LINGER option is set on a socket and there is still data waiting to * be sent when the socket is closed, then the close operation will block * until either that data is delivered or until the timeout period * expires. The linger interval is specified in hundreths of a second * (platform specific?) * * @param on true to enable SO_LINGER, false to disable * @param linger The SO_LINGER timeout in hundreths of a second or -1 if * SO_LINGER not set. * * @exception SocketException If an error occurs or Socket not connected * @exception IllegalArgumentException If linger is negative * * @since 1.1 */ public void setSoLinger(boolean on, int linger) throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); if (on) { if (linger < 0) throw new IllegalArgumentException("SO_LINGER must be >= 0"); if (linger > 65535) linger = 65535; getImpl().setOption(SocketOptions.SO_LINGER, new Integer(linger)); } else getImpl().setOption(SocketOptions.SO_LINGER, Boolean.valueOf(false)); } /** * Returns the value of the SO_LINGER option on the socket. If the * SO_LINGER option is set on a socket and there is still data waiting to * be sent when the socket is closed, then the close operation will block * until either that data is delivered or until the timeout period * expires. This method either returns the timeouts (in hundredths of * of a second (platform specific?)) if SO_LINGER is set, or -1 if * SO_LINGER is not set. * * @return The SO_LINGER timeout in hundreths of a second or -1 * if SO_LINGER not set * * @exception SocketException If an error occurs or Socket is not connected * * @since 1.1 */ public int getSoLinger() throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); Object linger = getImpl().getOption(SocketOptions.SO_LINGER); if (linger instanceof Integer) return (((Integer) linger).intValue()); else return -1; } /** * Sends urgent data through the socket * * @param data The data to send. * Only the lowest eight bits of data are sent * * @exception IOException If an error occurs * * @since 1.4 */ public void sendUrgentData(int data) throws IOException { if (isClosed()) throw new SocketException("socket is closed"); getImpl().sendUrgentData(data); } /** * Enables/disables the SO_OOBINLINE option * * @param on True if SO_OOBLINE should be enabled * * @exception SocketException If an error occurs * * @since 1.4 */ public void setOOBInline(boolean on) throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); getImpl().setOption(SocketOptions.SO_OOBINLINE, Boolean.valueOf(on)); } /** * Returns the current setting of the SO_OOBINLINE option for this socket * * @return True if SO_OOBINLINE is set, false otherwise. * * @exception SocketException If an error occurs * * @since 1.4 */ public boolean getOOBInline() throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); Object buf = getImpl().getOption(SocketOptions.SO_OOBINLINE); if (buf instanceof Boolean) return (((Boolean) buf).booleanValue()); else throw new SocketException("Internal Error: Unexpected type"); } /** * Sets the value of the SO_TIMEOUT option on the socket. If this value * is set, and an read/write is performed that does not complete within * the timeout period, a short count is returned (or an EWOULDBLOCK signal * would be sent in Unix if no data had been read). A value of 0 for * this option implies that there is no timeout (ie, operations will * block forever). On systems that have separate read and write timeout * values, this method returns the read timeout. This * value is in milliseconds. * * @param timeout The length of the timeout in milliseconds, or * 0 to indicate no timeout. * * @exception SocketException If an error occurs or Socket not connected * * @since 1.1 */ public synchronized void setSoTimeout(int timeout) throws SocketException { if (isClosed()) throw new SocketException("socket is closed"); if (timeout < 0) throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0"); getImpl().setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); } /** * Returns the value of the SO_TIMEOUT option on the socket. If this value * is set, and an read/write is performed that does not complete within * the timeout period, a short count is returned (or an EWOULDBLOCK signal * would be sent in Unix if no data had been read). A value of 0 for * this option implies that there is no timeout (ie, operations will * block forever). On systems that have separate read and write timeout * values, this method returns the read timeout. This * value is in thousandths of a second (implementation specific?). * * @return The length of the timeout in thousandth's of a second or 0 * if not set * * @exception SocketException If an error occurs or Socket not connected * * @since 1.1 */ public synchronized int getSoTimeout() throws SocketException {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -