- Everything You Need To Know about TCP/IP but Failed to Learn in Kindergarten
- A Client Socket in Java
- Sending Email by Java
- A Server Socket in Java
- HTTP and Web Browsing: Retrieving HTTP Pages
- How to Make an Applet Write a File on the Server
- A Multithreaded HTTP Server
- A Mapped I/O HTTP Server
- Further Reading
- Exercises
- Some Light Relief—Using Java to Stuff an Online Poll
A Client Socket in Java
This section shows a simple example of using a socket to communicate with another computer. You should type this code in and try it. If you haven't done much network programming, you'll find it a gleeful experience as you network with systems around the planet, and even in space. The space shuttle has a TCP/IP connection to Mission Control, but the spoilsports at NASA keep its address secret.
There is an Internet protocol known as Network Time Protocol or NTP. NTP is used to synchronize the clocks of some computers. Without periodic sync'ing, computer clocks tend to drift out of alignment, causing problems for times they need to agree on, like email and file timestamps. NTP is pretty fancy these days, but a simple part of the protocol involves making a socket connection to a NTP server to get the time.
Our example program will open a socket connection to an NTP server and print out the time it gets back. The way a client asks for the time is simply to make a socket connection to port 13 on an NTP server. Port 13 is the Internet standard on all computers for the time of day port. You don't have to identify yourself or write some data indicating what you want. Just making the socket connection is enough to get the server to give you an answer. Java does all the work of assembling the bytes into packets, sending them, and giving you an input stream with the bytes coming back from the server.
Here is a Java program that connects to an NTP server and asks the time:
import java.io.*; import java.net.*; public class AskTime { public static void main(String a[]) throws Exception { if (a.length!=1) { System.out.println("usage: java AskTime <systemname> "); System.exit(0); } String machine = a[0]; final int daytimeport = 13; Socket so = new Socket(machine, daytimeport); BufferedReader br = new BufferedReader( new InputStreamReader( so.getInputStream() ) ); String timestamp = br.readLine(); System.out.println( machine + " says it is " + timestamp ); } }
The program expects the name of an NTP server to be passed to it on the commandline. There are about 200,000 NTP servers on the Internet. Several national standards organizations allow reading the time via NTP. Table 17-1 gives some addresses for the service.
Table 171 Some Global Timeservers
Organization |
NTP Server |
IP Address |
Silicon Graphics Inc., Mtn. View, CA, USA |
clock.sgi.com |
192.48.153.74 |
Physikalisch-Technischen Bundesanstalt, Germany |
ptbtime1.ptb.de |
194.95.250.35 |
Mass Inst. Technology, USA |
tick.mit.edu |
18.145.0.30 |
US Naval Observatory, Washington, DC |
tock.usno.navy.mil |
192.5.41.41 |
Univ. of Adelaide, Australia |
ntp.adelaide.edu.au |
129.127.40.3 |
Inet Inc., Seoul, Korea |
time.nuri.net |
203.255.12.4 |
These servers come and go. Do a web search on "NTP server" for a current list. When you run the program, giving a hostname as argument, you see this:
% java AskTime ntp.adelaide.edu.au ntp.adelaide.edu.au says it is Wed Oct 17 23:20:32 2001
TCP/IP on Windows
Your Java network programs are going to work only if you are using a <Anchor0>computer that has an IP address and a connection to a TCP/IP network.
On a Unix workstation, TCP/IP support is a standard part of the operating system. On Windows 95, you'll need to have the TCP/IP protocol stack (library) installed.
Networking in Windows 9x can be fussy. You'll find that you have to have an active dial-up connection to get any part of it to work.
You can even provide the IP address instead of the server name, and the program will work equally well.
This program demonstrates how easy it is to open a socket connection to a port on another computer using the Java networking library. It's just flat out impressive to write a dozen lines of code that can ask a computer anywhere on the planet to tell you the time. Maybe there's something to this Internet thing, after all.
Sockets are used in client or in server mode. The program above is an example of the client use of socket. The client side initiates the contact. It is like knocking on a door or calling a phone number and starting a conversation with whoever answers.
The server side is just sitting there, waiting on a socket until someone shows up to ask for something. We will show how to write a server socket a little later in the chapter. The next topic is another example of how a client can obtain a service by opening a socket connection and writing to it. The example here is sending email, by writing to the mailserver port which (as another Internet standard) lives on port 25.