socket.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 1,064 行 · 第 1/3 页

JAVA
1,064
字号
	/**
	 * Connects the socket with a remote address. A timeout of zero is
	 * interpreted as an infinite timeout. The connection will then block
	 * until established or an error occurs.
	 *
	 * @param endpoint The address to connect to
	 *
	 * @exception IOException If an error occurs
	 * @exception IllegalArgumentException If the address type is not supported
	 * @exception IllegalBlockingModeException If this socket has an associated
	 * channel, and the channel is in non-blocking mode
	 * @exception SocketTimeoutException If the timeout is reached
	 * 
	 * @since 1.4
	 */
	public void connect(SocketAddress endpoint, int timeout)
		throws IOException {
		if (closed)
			throw new SocketException("Socket is closed");

		if (!(endpoint instanceof InetSocketAddress))
			throw new IllegalArgumentException("Address type not supported");

		if (ch != null && !ch.isBlocking())
			throw new IllegalBlockingModeException();

		impl.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 (impl != null)
			return impl.getInetAddress();

		return null;
	}

	/**
	 * Returns the local address to which this socket is bound.  If this socket
	 * is not connected, then <code>null</code> is returned.
	 *
	 * @return The local address
	 *
	 * @since 1.1
	 */
	public InetAddress getLocalAddress() {
		if (impl == null)
			return null;

		InetAddress addr = null;
		try {
			addr = (InetAddress)impl.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 -1 is returned.
	 *
	 * @return The remote port this socket is connected to
	 */
	public int getPort() {
		if (impl != null)
			return impl.getPort();

		return -1;
	}

	/**
	 * 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 (impl != null)
			return impl.getLocalPort();

		return -1;
	}

	/**
	 * If the socket is already bound this returns the local SocketAddress,
	 * otherwise null
	 *
	 * @since 1.4
	 */
	public SocketAddress getLocalSocketAddress() {
		InetAddress addr = getLocalAddress();

		if (addr == null)
			return null;

		return new InetSocketAddress(addr, impl.getLocalPort());
	}

	/**
	 * If the socket is already connected this returns the remote SocketAddress,
	 * otherwise null
	 *
	 * @since 1.4
	 */
	public SocketAddress getRemoteSocketAddress() {
		if (!isConnected())
			return null;

		return new InetSocketAddress(impl.getInetAddress(), impl.getPort());
	}

	/**
	 * 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 (impl != null)
			return (impl.getInputStream());

		throw new IOException("Not connected");
	}

	/**
	 * 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 (impl != null)
			return impl.getOutputStream();

		throw new IOException("Not connected");
	}

	/**
	 * 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 (impl == null)
			throw new SocketException("Not connected");

		impl.setOption(SocketOptions.TCP_NODELAY, new Boolean(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 (impl == null)
			throw new SocketException("Not connected");

		Object on = impl.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 (impl == null)
			throw new SocketException("No socket created");

		if (on == true) {
			if (linger < 0)
				throw new IllegalArgumentException("SO_LINGER must be >= 0");

			if (linger > 65535)
				linger = 65535;

			impl.setOption(SocketOptions.SO_LINGER, new Integer(linger));
		} else {
			impl.setOption(SocketOptions.SO_LINGER, new Boolean(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 (impl == null)
			throw new SocketException("Not connected");

		Object linger = impl.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 {
		impl.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 (impl == null)
			throw new SocketException("Not connected");

		impl.setOption(SocketOptions.SO_OOBINLINE, new Boolean(on));
	}

	/**
	 * Returns the current setting of the SO_OOBINLINE option for this socket
	 * 
	 * @exception SocketException If an error occurs
	 * 
	 * @since 1.4
	 */
	public boolean getOOBInline() throws SocketException {
		if (impl == null)
			throw new SocketException("Not connected");

		Object buf = impl.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 thousandths of a second.
	 *
	 * @param timeout The length of the timeout in thousandths of a second, 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 (impl == null)
			throw new SocketException("Not connected");

		if (timeout < 0)
			throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0");

		impl.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 {
		if (impl == null)
			throw new SocketException("Not connected");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?