// Socket.java /* Copyright (C) 1999 Cygnus Solutions 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 * @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; } }