Chapter 10. Sockets for Servers
The last chapter discussed sockets from
the standpoint of clients: programs that open a
socket to a server that's listening for connections.
However, client sockets themselves aren't enough;
clients aren't much use unless they can talk to a
server, and the Socket class discussed in the last
chapter is not sufficient for writing servers. To create a
Socket, you need to know the Internet host to
which you want to connect. When you're writing a
server, you don't know in advance who will contact
you, and even if you did, you wouldn't know when
that host wanted to contact you. In other words, servers are like
receptionists who sit by the phone and wait for incoming calls. They
don't know who will call or when, only that when the
phone rings, they have to pick it up and talk to whoever is there.
You can't program that behavior with the
Socket class alone.For servers that accept connections, Java provides a
ServerSocket class that represents server sockets.
In essence, a server socket's job is to sit by the
phone and wait for incoming calls. More technically, a server socket
runs on the server and listens for incoming TCP connections. Each
server socket listens on a particular port on the server machine.
When a client on a remote host attempts to connect to that port, the
server wakes up, negotiates the connection between the client and the
server, and returns a regular Socket object
representing the socket between the two hosts. In other words, server
sockets wait for connections while client sockets initiate
connections. Once a ServerSocket has set up the
connection, the server uses a regular Socket
object to send data to the client. Data always travels over the
regular socket.