Java in a Nutshell, 5th Edition [Electronic resources]

نسخه متنی -صفحه : 1191/ 389
نمايش فراداده

Socketjava.net

Java 1.0

This class implements a socket for stream-based communication over the network. See URL for a higher-level interface to networking and DatagramSocket for a lower-level interface.

Before you can use a socket for communication, it must be

bound to a local address and

connected to a remote address. Binding and connection are done automatically for you when you call any of the Socket( ) constructors except the no-argument constructor. These constructors allow you to specify either the name or the InetAddress of the computer to connect to, and also require you to specify the port number to connect to. Two of these constructors also allow you to specify the local InetAddress and port number to bind the socket to. Most applications do not need to specify a local address, and can simply use one of the two-argument versions of Socket( ) and can allow the constructor to choose an ephemeral local port to bind the socket to.

The no-argument Socket( ) constructor is different from the others: it creates an unbound and unconnected socket. In Java 1.4 and later, you can explicitly call bind( ) and connect( ) to bind and connect the socket. It can be useful to do this when you want to set a socket option (described below) that must be set before binding or connection. bind( ) uses a SocketAddress object to describe the local address to bind to, and connect( ) uses a SocketAddress to specify the remote address to connect to. There is also a version of connect( ) that takes a timeout value in milliseconds: if the connection attempt takes longer than the specified amount of time, connect( ) throws an IOException. (See ServerSocket for a description of how to write server code that accepts socket connection requests from client code.) Java 5.0 includes a constructor that takes a Proxy object as its sole argument. Like the no-argument constructor, this creates an unbound and unconnected socket. When you attempt to connect it, the connection will be made through the specified Proxy.

Use isBound( ) and isConnected( ) to determine whether a Socket is bound and connected. Use getInetAddress( ) and getPort( ) to determine the IP address and port number that the socket is connected to. Or, in Java 1.4 and later, use geTRemoteSocketAddress( ) to obtain the remote address as a SocketAddress object. Similarly, use getLocalAddress( ) and getLocalPort( ) or use getLocalSocketAddress( ) to find out what address a socket is bound to.

Once you have a Socket object that is bound and connected, use getInputStream( ) and getOutputStream( ) to obtain InputStream and OutputStream objects you can use to communicate with the remote host. You can use these streams just as you would use similar streams for file input and output. When you are done with a Socket, use close( ) to close it. Once a socket has been closed, it is not possible to call connect( ) again to reuse it, and you should not call any of its methods except isClosed( ). Because networking code can throw many exceptions, it is common practice to close( ) a socket in the finally clause of a try/catch statement to ensure that the socket always gets closed. Note, however, that the close( ) method itself can throw an IOException, and you may need to put it in its own try block. In Java 1.3 and later shutdownInput( ) and shutdownOutput( ) allow you to close the input and output communication channels individually without closing the entire socket. In Java 1.4 and later, isInputShutdown( ) and isOutputShutdown( ) allow you to test for this.

The Socket class defines a number of methods that allow you to set (and query) "socket options" that affect the low-level networking behavior of the socket. setSendBufferSize( ) and setReceiveBufferSize( ) provide hints to the underlying networking system about what buffer size is best to use with this socket. setSoTimeout( ) specifies the number of milliseconds a read( ) call on the input stream returned by getInputStream( ) waits for data before throwing an InterruptedIOException. The default value of 0 specifies that the stream blocks indefinitely. setSoLinger( ) specifies what to do when a socket is closed while there is still data waiting to be transmitted. If lingering is turned on, the close( ) call blocks for up to the specified number of seconds while attempting to transmit the remaining data. Calling setTcpNoDelay( ) with an argument of TRue causes data to be sent through the socket as soon as it is available, instead of waiting for the TCP packet to become more full before sending it. In Java 1.3, use setKeepAlive( ) to enable or disable the periodic exchange of control messages across an idle socket connection. The keepalive protocol enables a client to determine if its server has crashed without closing the socket and vice versa. In Java 1.4, pass true to setOOBInline( ) if you want to receive "out of band" data sent to this socket "inline" on the input stream of the socket (by default such data is simply discarded). This can be used to receive bytes sent with sendUrgentData( ). Java 1.4 also adds setReuseAddress( ) which you can use before binding the socket to specify that the socket should be allowed to bind to a port that is still nominally in use by another socket that is in the process of shutting down. setTrafficClass( ) is also new in Java 1.4; it sets the "traffic class" field for the socket, and requires an understanding of the low-level details of the IP protocol.

The getChannel( ) method is a link between this Socket class and the New I/O java.nio.channels.SocketChannel class. It returns the SocketChannel associated with this Socket if there is one. Note, however, that this method always returns null for sockets created with any of the Socket( ) constructors. If you create a SocketChannel object, and obtain a Socket from it, then the getChannel( ) method provides a way to link back to the parent channel.

public class

Socket { // Public Constructors

1.1 public

Socket ( );

5.0 public

Socket (java.net.Proxy

proxy ); public

Socket (String

host , int

port ) throws UnknownHostException, java.io.IOException; public

Socket (InetAddress

address , int

port ) throws java.io.IOException;

# public

Socket (String

host , int

port , boolean

stream ) throws java.io.IOException;

# public

Socket (InetAddress

host , int

port , boolean

stream ) throws java.io.IOException;

1.1 public

Socket (String

host , int

port , InetAddress

localAddr , int

localPort ) throws java.io.IOException;

1.1 public

Socket (InetAddress

address , int

port , InetAddress

localAddr , int

localPort ) throws java.io.IOException; // Protected Constructors

1.1 protected

Socket (SocketImpl

impl ) throws SocketException; // Public Class Methods public static void

setSocketImplFactory (SocketImplFactory

fac ) throws java.io.IOException; synchronized // Public Instance Methods

1.4 public void

bind (SocketAddress

bindpoint ) throws java.io.IOException; public void

close ( ) throws java.io.IOException; synchronized

1.4 public void

connect (SocketAddress

endpoint ) throws java.io.IOException;

1.4 public void

connect (SocketAddress

endpoint , int

timeout ) throws java.io.IOException;

1.4 public java.nio.channels.SocketChannel

getChannel ( ); constant default:null public InetAddress

getInetAddress ( ); default:null public java.io.InputStream

getInputStream ( ) throws java.io.IOException;

1.3 public boolean

getKeepAlive ( ) throws SocketException; default:false

1.1 public InetAddress

getLocalAddress ( ); default:Inet4Address public int

getLocalPort ( ); default:-1

1.4 public SocketAddress

getLocalSocketAddress ( ); default:null

1.4 public boolean

getOOBInline ( ) throws SocketException; default:false public java.io.OutputStream

getOutputStream ( ) throws java.io.IOException; public int

getPort ( ); default:0

1.2 public int

getReceiveBufferSize ( ) throws SocketException; synchronized default:43690

1.4 public SocketAddress

getRemoteSocketAddress ( ); default:null

1.4 public boolean

getReuseAddress ( ) throws SocketException; default:false

1.2 public int

getSendBufferSize ( ) throws SocketException; synchronized default:8192

1.1 public int

getSoLinger ( ) throws SocketException; default:-1

1.1 public int

getSoTimeout ( ) throws SocketException; synchronized default:0

1.1 public boolean

getTcpNoDelay ( ) throws SocketException; default:false

1.4 public int

getTrafficClass ( ) throws SocketException; default:0

1.4 public boolean

isBound ( ); default:false

1.4 public boolean

isClosed ( ); default:false

1.4 public boolean

isConnected ( ); default:false

1.4 public boolean

isInputShutdown ( ); default:false

1.4 public boolean

isOutputShutdown ( ); default:false

1.4 public void

sendUrgentData (int

data ) throws java.io.IOException;

1.3 public void

setKeepAlive (boolean

on ) throws SocketException;

1.4 public void

setOOBInline (boolean

on ) throws SocketException;

5.0 public void

setPerformancePreferences (int

connectionTime , int

latency , int

bandwidth ); empty

1.2 public void

setReceiveBufferSize (int

size ) throws SocketException; synchronized

1.4 public void

setReuseAddress (boolean

on ) throws SocketException;

1.2 public void

setSendBufferSize (int

size ) throws SocketException; synchronized

1.1 public void

setSoLinger (boolean

on , int

linger ) throws SocketException;

1.1 public void

setSoTimeout (int

timeout ) throws SocketException; synchronized

1.1 public void

setTcpNoDelay (boolean

on ) throws SocketException;

1.4 public void

setTrafficClass (int

tc ) throws SocketException;

1.3 public void

shutdownInput ( ) throws java.io.IOException;

1.3 public void

shutdownOutput ( ) throws java.io.IOException; // Public Methods Overriding Object public String

toString ( ); }

Subclasses

javax.net.ssl.SSLSocket

Passed To

ServerSocket.implAccept( ), javax.net.ssl.SSLSocketFactory.createSocket( ), javax.net.ssl.X509KeyManager.{chooseClientAlias( ), chooseServerAlias( )}

Returned By

ServerSocket.accept( ), java.nio.channels.SocketChannel.socket( ), javax.net.SocketFactory.createSocket( ), javax.net.ssl.SSLSocketFactory.createSocket( )