blob: 34ea165e51a22ed641ee5dd2959de85aed0c4a2b [file] [log] [blame]
// 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;
}
}