| // Socket.java | |
| /* Copyright (C) 1999 Free Software Foundation | |
| This file is part of libgcj. | |
| This software is copyrighted work licensed under the terms of the | |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for | |
| details. */ | |
| /** | |
| * @author Per Bothner <bothner@cygnus.com> | |
| * @date January 6, 1999. | |
| */ | |
| /** Written using on-line Java Platform 1.2 API Specification. | |
| * Status: I believe all methods are implemented. | |
| */ | |
| package java.net; | |
| import java.io.*; | |
| public class Socket | |
| { | |
| static SocketImplFactory factory; | |
| SocketImpl impl; | |
| protected Socket () | |
| { | |
| } | |
| protected Socket (SocketImpl impl) throws SocketException | |
| { | |
| this.impl = impl; | |
| } | |
| public Socket (String host, int port) | |
| throws UnknownHostException, IOException | |
| { | |
| this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(host, port); | |
| impl.create(true); | |
| // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, | |
| // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as | |
| // that default. JDK 1.2 doc infers not to do a bind. | |
| impl.connect(host, port); | |
| } | |
| public Socket (InetAddress address, int port) | |
| throws IOException | |
| { | |
| this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(address.getHostName(), port); | |
| impl.create(true); | |
| // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, | |
| // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as | |
| // that default. JDK 1.2 doc infers not to do a bind. | |
| impl.connect(address, port); | |
| } | |
| public Socket (String host, int port, | |
| InetAddress localAddr, int localPort) throws IOException | |
| { | |
| this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(host, port); | |
| impl.create(true); | |
| // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress(). | |
| impl.bind(localAddr, localPort); | |
| impl.connect(host, port); | |
| } | |
| public Socket (InetAddress address, int port, | |
| InetAddress localAddr, int localPort) throws IOException | |
| { | |
| this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(address.getHostName(), port); | |
| impl.create(true); | |
| // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress(). | |
| impl.bind(localAddr, localPort); | |
| impl.connect(address, port); | |
| } | |
| /** | |
| * @deprecated Use DatagramSocket instead for UDP transport. | |
| */ | |
| public Socket (String host, int port, boolean stream) throws IOException | |
| { | |
| impl = factory == null ? new PlainSocketImpl() | |
| : factory.createSocketImpl(); | |
| impl.create(stream); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(host, port); | |
| // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, | |
| // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as | |
| // that default. JDK 1.2 doc infers not to do a bind. | |
| impl.connect(host, port); | |
| } | |
| /** | |
| * @deprecated Use DatagramSocket instead for UDP transport. | |
| */ | |
| public Socket (InetAddress host, int port, boolean stream) throws IOException | |
| { | |
| impl = factory == null ? new PlainSocketImpl() | |
| : factory.createSocketImpl(); | |
| impl.create(stream); | |
| SecurityManager s = System.getSecurityManager(); | |
| if (s != null) | |
| s.checkConnect(host.getHostName(), port); | |
| // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, | |
| // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as | |
| // that default. JDK 1.2 doc infers not to do a bind. | |
| impl.connect(host, port); | |
| } | |
| public InetAddress getInetAddress () | |
| { | |
| return impl.getInetAddress(); | |
| } | |
| public InetAddress getLocalAddress () | |
| { | |
| // FIXME: see note in DatagramSocket.java about checkConnect() and security | |
| try | |
| { | |
| return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR); | |
| } | |
| catch (SocketException x) | |
| { | |
| // (hopefully) shouldn't happen | |
| System.err.println(x); | |
| throw new java.lang.InternalError("Error in PlainSocketImpl.getOption"); | |
| } | |
| } | |
| public int getPort () | |
| { | |
| return impl.getPort(); | |
| } | |
| public int getLocalPort () | |
| { | |
| return impl.getLocalPort(); | |
| } | |
| public InputStream getInputStream () throws IOException | |
| { | |
| return impl.getInputStream(); | |
| } | |
| public OutputStream getOutputStream () throws IOException | |
| { | |
| return impl.getOutputStream(); | |
| } | |
| public void setTcpNoDelay (boolean on) throws SocketException | |
| { | |
| impl.setOption( SocketOptions.TCP_NODELAY, new Boolean(on) ); | |
| } | |
| public boolean getTcpNoDelay() throws SocketException | |
| { | |
| Boolean bool = (Boolean)impl.getOption( SocketOptions.TCP_NODELAY ); | |
| return bool.booleanValue(); | |
| } | |
| public void setSoLinger(boolean on, int linger) throws SocketException | |
| { | |
| if ( on && (linger >= 0) ) | |
| { | |
| if (linger > 65535) | |
| linger = 65535; | |
| impl.setOption( SocketOptions.SO_LINGER, new Integer(linger) ); | |
| } | |
| else if ( on && (linger < 0) ) | |
| throw new IllegalArgumentException("SO_LINGER must be >= 0"); | |
| else | |
| impl.setOption( SocketOptions.SO_LINGER, new Boolean(false) ); | |
| } | |
| public int getSoLinger() throws SocketException | |
| { | |
| Object linger = impl.getOption(SocketOptions.SO_LINGER); | |
| if (linger instanceof Integer) | |
| return ((Integer)linger).intValue(); | |
| else | |
| return -1; | |
| } | |
| public synchronized void setSoTimeout (int timeout) throws SocketException | |
| { | |
| if (timeout < 0) | |
| throw new IllegalArgumentException("Invalid timeout: " + timeout); | |
| impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); | |
| } | |
| public synchronized int getSoTimeout () throws SocketException | |
| { | |
| Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT); | |
| if (timeout instanceof Integer) | |
| return ((Integer)timeout).intValue(); | |
| else | |
| return 0; | |
| } | |
| // JDK1.2 | |
| public void setSendBufferSize (int size) throws SocketException | |
| { | |
| if (size <= 0) | |
| throw new IllegalArgumentException("Invalid buffer size: " + size); | |
| impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size)); | |
| } | |
| // JDK1.2 | |
| public int getSendBufferSize () throws SocketException | |
| { | |
| Integer buf = (Integer)impl.getOption(SocketOptions.SO_SNDBUF); | |
| return buf.intValue(); | |
| } | |
| // JDK1.2 | |
| public void setReceiveBufferSize (int size) throws SocketException | |
| { | |
| if (size <= 0) | |
| throw new IllegalArgumentException("Invalid buffer size: " + size); | |
| impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size)); | |
| } | |
| // JDK1.2 | |
| public int getReceiveBufferSize () throws SocketException | |
| { | |
| Integer buf = (Integer)impl.getOption(SocketOptions.SO_RCVBUF); | |
| return buf.intValue(); | |
| } | |
| public synchronized void close () throws IOException | |
| { | |
| impl.close(); | |
| } | |
| public String toString () | |
| { | |
| return "Socket" + impl.toString(); | |
| } | |
| public static synchronized void setSocketImplFactory (SocketImplFactory fac) | |
| throws IOException | |
| { | |
| factory = fac; | |
| } | |
| } |