epubjs
Version:
Render ePub documents in the browser, across many devices
234 lines (233 loc) • 30.9 kB
HTML
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Datagram Sockets</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="Datagram Sockets"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-13-SECT-2"/>Datagram Sockets</h1></div></div></div><p><code class="literal">TinyHttpd</code> used a <code class="literal">Socket</code> to create a connection to the client
using the TCP protocol. In that example, the TCP protocol took care of
data integrity; we didn’t have to worry about data arriving out of order
or incorrect. Now, let’s take a walk on the wild side, building an applet
that uses a <a id="I_indexterm13_id767658" class="indexterm"/><code class="literal">java.net.DatagramSocket</code>,
which uses the UDP protocol. A datagram is sort of like a letter sent via
the postal service: it’s a discrete chunk of data transmitted in one
packet. Unlike the previous example, where we could get a convenient
<code class="literal">OutputStream</code> from our <code class="literal">Socket</code> and write the data as if writing to a
file with a <code class="literal">DatagramSocket</code>, we have to
work one datagram at a time. (Of course, the TCP protocol was taking our
<code class="literal">OutputStream</code> and slicing the data into
packets, too, but we didn’t have to worry about those details.)</p><p><a id="I_indexterm13_id767698" class="indexterm"/> <a id="I_indexterm13_id767705" class="indexterm"/>UDP doesn’t guarantee that the data is received. If the data
packets are received, they may not arrive in the order in which they were
sent; it’s even possible for duplicate datagrams to arrive (under rare
circumstances). Using UDP is something like cutting the pages out of the
encyclopedia, putting them into separate envelopes, and mailing them to
your friend. If your friend wants to read the encyclopedia, it’s his or
her job to put the pages in order. If some pages get lost in the mail,
your friend has to send you a letter asking for replacements.</p><p>Obviously, you wouldn’t use UDP to send a huge amount of data
without error correction. However, it’s significantly more efficient than
TCP, particularly if you don’t care about the order in which messages
arrive or whether 100 percent of their arrival is guaranteed. For example,
in a simple periodic database lookup, the client can send a query; the
server’s response itself constitutes an acknowledgment. If the response
doesn’t arrive within a certain time, the client can just send another
query. It shouldn’t be hard for the client to match responses to its
original queries. <a id="I_indexterm13_id767725" class="indexterm"/><a id="I_indexterm13_id767730" class="indexterm"/>Some important applications that use UDP are the Domain Name
System (DNS) and Sun’s Network File System (NFS).</p><div class="sect2" title="author="pat” timestamp="20120926T141346-0500” comment="I actually rewrote this as a standalone client but then decided to leave it as an applet”The HeartBeat Applet"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-13-SECT-2.1"/>The HeartBeat Applet</h2></div></div></div><p><a id="idx10773" class="indexterm"/>In this section, we build a simple applet, <code class="literal">HeartBeat</code>, that runs in a web browser and
sends a datagram to its server each time it’s started and stopped. We
also build a simple standalone server application, <code class="literal">Pulse</code>, that receives these datagrams and
prints them. Tracking the output could give you a crude measure of who
is currently looking at your web page at any given time (assuming that
firewalls do not block the UDP packets). This is the kind of thing UDP
is good for: we don’t want the overhead of a TCP socket, and if the
datagrams get lost, it’s no big deal.</p><p>First, the <code class="literal">HeartBeat</code>
applet:</p><a id="I_13_tt853"/><pre class="programlisting"> <code class="c1">//file: HeartBeat.java</code>
<code class="kn">import</code> <code class="nn">java.net.*</code><code class="o">;</code>
<code class="kn">import</code> <code class="nn">java.io.*</code><code class="o">;</code>
<code class="err"> </code>
<code class="kd">public</code> <code class="kd">class</code> <code class="nc">HeartBeat</code> <code class="kd">extends</code> <code class="n">java</code><code class="o">.</code><code class="na">applet</code><code class="o">.</code><code class="na">Applet</code> <code class="o">{</code>
<code class="n">String</code> <code class="n">myHost</code><code class="o">;</code>
<code class="kt">int</code> <code class="n">myPort</code><code class="o">;</code>
<code class="err"> </code>
<code class="kd">public</code> <code class="kt">void</code> <code class="nf">init</code><code class="o">()</code> <code class="o">{</code>
<code class="n">myHost</code> <code class="o">=</code> <code class="n">getCodeBase</code><code class="o">().</code><code class="na">getHost</code><code class="o">();</code>
<code class="n">myPort</code> <code class="o">=</code> <code class="n">Integer</code><code class="o">.</code><code class="na">parseInt</code><code class="o">(</code> <code class="n">getParameter</code><code class="o">(</code><code class="s">"myPort"</code><code class="o">)</code> <code class="o">);</code>
<code class="o">}</code>
<code class="err"> </code>
<code class="kd">private</code> <code class="kt">void</code> <code class="nf">sendMessage</code><code class="o">(</code> <code class="n">String</code> <code class="n">message</code> <code class="o">)</code> <code class="o">{</code>
<code class="k">try</code> <code class="o">{</code>
<code class="kt">byte</code> <code class="o">[]</code> <code class="n">data</code> <code class="o">=</code> <code class="n">message</code><code class="o">.</code><code class="na">getBytes</code><code class="o">(</code><code class="s">"UTF-8"</code><code class="o">);</code>
<code class="n">InetAddress</code> <code class="n">addr</code> <code class="o">=</code> <code class="n">InetAddress</code><code class="o">.</code><code class="na">getByName</code><code class="o">(</code> <code class="n">myHost</code> <code class="o">);</code>
<code class="n">DatagramPacket</code> <code class="n">packet</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">DatagramPacket</code><code class="o">(</code> <code class="n">data</code><code class="o">,</code> <code class="n">data</code><code class="o">.</code><code class="na">length</code><code class="o">,</code> <code class="n">addr</code><code class="o">,</code> <code class="n">myPort</code> <code class="o">);</code>
<code class="n">DatagramSocket</code> <code class="n">ds</code> <code class="o">=</code> <code class="k">new</code> <code class="n">DatagramSocket</code><code class="o">();</code>
<code class="n">ds</code><code class="o">.</code><code class="na">send</code><code class="o">(</code> <code class="n">packet</code> <code class="o">);</code>
<code class="n">ds</code><code class="o">.</code><code class="na">close</code><code class="o">();</code>
<code class="o">}</code> <code class="k">catch</code> <code class="o">(</code> <code class="n">IOException</code> <code class="n">e</code> <code class="o">)</code> <code class="o">{</code>
<code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="n">e</code> <code class="o">);</code> <code class="c1">// Error creating socket</code>
<code class="o">}</code>
<code class="o">}</code>
<code class="err"> </code>
<code class="kd">public</code> <code class="kt">void</code> <code class="nf">start</code><code class="o">()</code> <code class="o">{</code>
<code class="n">sendMessage</code><code class="o">(</code><code class="s">"Arrived"</code><code class="o">);</code>
<code class="o">}</code>
<code class="kd">public</code> <code class="kt">void</code> <code class="nf">stop</code><code class="o">()</code> <code class="o">{</code>
<code class="n">sendMessage</code><code class="o">(</code><code class="s">"Departed"</code><code class="o">);</code>
<code class="o">}</code>
<code class="o">}</code></pre><p>Compile the applet and include it in an HTML document with an
<a id="I_indexterm13_id767821" class="indexterm"/><code class="literal"><applet></code>
tag:</p><a id="I_13_tt854"/><pre class="programlisting"><code class="o"><</code><code class="n">html</code><code class="o">><</code><code class="n">body</code><code class="o">></code>
<code class="o"><</code><code class="n">h1</code><code class="o">></code><code class="n">Heartbeat</code><code class="o">!</</code><code class="n">h1</code><code class="o">></code>
<code class="o"><</code><code class="n">applet</code> <code class="n">height</code><code class="o">=</code><code class="s">"1 "</code> <code class="n">width</code><code class="o">=</code><code class="s">"1 "</code> <code class="n">code</code><code class="o">=</code><code class="s">"HeartBeat "</code><code class="o">></code>
<code class="o"><</code><code class="n">param</code> <code class="n">name</code><code class="o">=</code><code class="s">"myPort"</code> <code class="n">value</code><code class="o">=</code><code class="s">"1234"</code><code class="o">></code>
<code class="o"></</code><code class="n">applet</code><code class="o">></code>
<code class="o"></</code><code class="n">body</code><code class="o">></</code><code class="n">html</code><code class="o">></code></pre><p>Make sure to place the compiled
<span class="emphasis"><em>HeartBeat.class</em></span> file in the same directory as the
HTML document (which we’ll refer to as <code class="literal">heartbeat.html</code>). We talk more about embedding
applets in HTML documents in <a class="xref" href="ch23.html" title="Chapter 23. Applets">Chapter 23</a>.</p><p>The <code class="literal">myPort</code> parameter should
specify the port number on which our server application listens for data
(“1234” as just shown).</p><p>Next, the server-side application, <code class="literal">Pulse</code>:</p><a id="I_13_tt855"/><pre class="programlisting"> <code class="c1">//file: Pulse.java</code>
<code class="kn">import</code> <code class="nn">java.net.*</code><code class="o">;</code>
<code class="kn">import</code> <code class="nn">java.io.*</code><code class="o">;</code>
<code class="err"> </code>
<code class="kd">public</code> <code class="kd">class</code> <code class="nc">Pulse</code> <code class="o">{</code>
<code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code> <code class="n">String</code> <code class="o">[]</code> <code class="n">argv</code> <code class="o">)</code> <code class="kd">throws</code> <code class="n">IOException</code> <code class="o">{</code>
<code class="n">DatagramSocket</code> <code class="n">s</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">DatagramSocket</code><code class="o">(</code> <code class="n">Integer</code><code class="o">.</code><code class="na">parseInt</code><code class="o">(</code><code class="n">argv</code><code class="o">[</code><code class="mi">0</code><code class="o">])</code> <code class="o">);</code>
<code class="err"> </code>
<code class="k">while</code> <code class="o">(</code> <code class="kc">true</code> <code class="o">)</code> <code class="o">{</code>
<code class="n">DatagramPacket</code> <code class="n">packet</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">DatagramPacket</code><code class="o">(</code> <code class="k">new</code> <code class="kt">byte</code> <code class="o">[</code><code class="mi">1024</code><code class="o">],</code> <code class="mi">1024</code> <code class="o">);</code>
<code class="n">s</code><code class="o">.</code><code class="na">receive</code><code class="o">(</code> <code class="n">packet</code> <code class="o">);</code>
<code class="n">String</code> <code class="n">message</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code><code class="o">(</code>
<code class="n">packet</code><code class="o">.</code><code class="na">getData</code><code class="o">(),</code> <code class="mi">0</code><code class="o">,</code> <code class="n">packet</code><code class="o">.</code><code class="na">getLength</code><code class="o">(),</code><code class="s">"UTF-8"</code> <code class="o">);</code>
<code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">"Heartbeat from: "</code>
<code class="o">+</code> <code class="n">packet</code><code class="o">.</code><code class="na">getAddress</code><code class="o">().</code><code class="na">getHostName</code><code class="o">()</code>
<code class="o">+</code> <code class="s">" - "</code> <code class="o">+</code> <code class="n">message</code> <code class="o">);</code>
<code class="o">}</code>
<code class="o">}</code>
<code class="o">}</code></pre><p>Compile <code class="literal">Pulse</code> and run it on
your web server, specifying the port number as an argument:</p><a id="I_13_tt856"/><pre class="programlisting"> <code class="o">%</code> <strong class="userinput"><code><code class="n">java</code> <code class="n">Pulse</code> <code class="mi">1234</code></code></strong></pre><p>The port number should be the same as the one you used in the
<code class="literal">myPort</code> parameter of the <code class="literal"><applet></code> tag for <code class="literal">HeartBeat</code>.</p><p>Now to run the example we’re going to need a web server. Opening
the file directly in your browser will not work here because, as we
mentioned earlier, applets are only allowed to talk to the host that
served them and when no web server is involved, the security manager
doesn’t allow any network communications at all. Fortunately, we wrote a
satisfactory web server, <code class="literal">TinyHttpd</code>,
earlier in this chapter! Just run <code class="literal">TinyHttpd</code> in the directory with your
<span class="emphasis"><em>heartbeat.html</em></span> file—being careful to specify a
different port number than our <code class="literal">HeartBeat</code> client and <code class="literal">Pulse</code> server—and use it to serve up the page.
We tested this in Safari on a Mac at the time of this writing and it
worked as expected. But if you have issues you can try a “real” web
server and we won’t be offended.</p><p>Now, pull up the web page in your browser. You won’t see much
there (a better application might do something visual as well), but you
should get a blip from the <code class="literal">Pulse</code>
application. Leave the page and return to it a few times. Each time the
applet is started or stopped, it sends a message that <code class="literal">Pulse</code> reports:</p><a id="I_13_tt857"/><pre class="programlisting"> <code class="n">Heartbeat</code> <code class="nl">from:</code> <code class="n">foo</code><code class="o">.</code><code class="na">bar</code><code class="o">.</code><code class="na">com</code> <code class="o">-</code> <code class="n">Arrived</code>
<code class="n">Heartbeat</code> <code class="nl">from:</code> <code class="n">foo</code><code class="o">.</code><code class="na">bar</code><code class="o">.</code><code class="na">com</code> <code class="o">-</code> <code class="n">Departed</code>
<code class="n">Heartbeat</code> <code class="nl">from:</code> <code class="n">foo</code><code class="o">.</code><code class="na">bar</code><code class="o">.</code><code class="na">com</code> <code class="o">-</code> <code class="n">Arrived</code>
<code class="n">Heartbeat</code> <code class="nl">from:</code> <code class="n">foo</code><code class="o">.</code><code class="na">bar</code><code class="o">.</code><code class="na">com</code> <code class="o">-</code> <code class="n">Departed</code>
<code class="o">...</code></pre><p>Cool, eh? Just remember that the datagrams are not guaranteed to
arrive (although it’s highly unlikely you’ll ever see them fail on a
normal network), and it’s possible that you could miss an arrival or a
departure. Now let’s look at the code.</p><div class="sect3" title="The HeartBeat applet code"><div class="titlepage"><div><div><h3 class="title"><a id="learnjava3-CHP-13-SECT-2.1.1"/>The HeartBeat applet code</h3></div></div></div><p><a id="idx10763" class="indexterm"/> <a id="idx10768" class="indexterm"/> <code class="literal">HeartBeat</code> overrides
the <a id="I_indexterm13_id768050" class="indexterm"/><code class="literal">init()</code>, <a id="I_indexterm13_id768063" class="indexterm"/><code class="literal">start()</code>, and
<a id="I_indexterm13_id768073" class="indexterm"/><code class="literal">stop()</code> methods of the
<a id="I_indexterm13_id768086" class="indexterm"/><code class="literal">Applet</code> class and
implements one private method of its own, <code class="literal">sendMessage()</code>, which sends a datagram. (We
haven’t covered applets yet, so if you want more details, refer to
<a class="xref" href="ch23.html" title="Chapter 23. Applets">Chapter 23</a>.) <code class="literal">HeartBeat</code> begins its life in <code class="literal">init()</code>, where it determines the destination
for its messages. It uses the <code class="literal">Applet
getCodeBase()</code> and <a id="I_indexterm13_id768126" class="indexterm"/><code class="literal">getHost()</code> methods to
find the name of its originating host and fetches the correct port
number from the <code class="literal">myPort</code> parameter of
the <code class="literal"><applet></code> tag. After
<code class="literal">init()</code> has finished, the <code class="literal">start()</code> and <code class="literal">stop()</code> methods are called whenever the
applet is started or stopped. These methods merely call <code class="literal">sendMessage()</code> with the appropriate
message.</p><p><code class="literal">sendMessage()</code> is responsible
for sending a <code class="literal">String</code> message to the
server as a datagram. It takes the text as an argument, constructs a
datagram packet containing the message, and then sends the datagram.
All the datagram information is packed into a <a id="I_indexterm13_id768185" class="indexterm"/><code class="literal">java.net.DatagramPacket</code> object, including
the destination and port number. The <code class="literal">DatagramPacket</code> is like an addressed
envelope, stuffed with our bytes. After the <code class="literal">DatagramPacket</code> is created, <code class="literal">sendMessage()</code> simply has to open a <code class="literal">DatagramSocket</code> and send it.</p><p>The first five lines of <code class="literal">sendMessage()</code> build the <code class="literal">DatagramPacket</code>:</p><a id="I_13_tt858"/><pre class="programlisting"> <code class="k">try</code> <code class="o">{</code>
<code class="kt">byte</code> <code class="o">[]</code> <code class="n">data</code> <code class="o">=</code> <code class="n">message</code><code class="o">.</code><code class="na">getBytes</code><code class="o">(</code><code class="s">"UTF-8"</code><code class="o">);</code>
<code class="n">InetAddress</code> <code class="n">addr</code> <code class="o">=</code> <code class="n">InetAddress</code><code class="o">.</code><code class="na">getByName</code><code class="o">(</code> <code class="n">myHost</code> <code class="o">);</code>
<code class="n">DatagramPacket</code> <code class="n">pack</code> <code class="o">=</code>
<code class="k">new</code> <code class="nf">DatagramPacket</code><code class="o">(</code><code class="n">data</code><code class="o">,</code> <code class="n">data</code><code class="o">.</code><code class="na">length</code><code class="o">,</code> <code class="n">addr</code><code class="o">,</code> <code class="n">myPort</code> <code class="o">);</code></pre><p>First, the contents of <code class="literal">message</code> are placed into an array of bytes
called <code class="literal">data</code>. Next a <a id="I_indexterm13_id768259" class="indexterm"/><code class="literal">java.net.InetAddress</code>
object is created by looking up the hostname <code class="literal">myHost</code>. An <code class="literal">InetAddress</code>
holds the network IP address for a host. This class also
provides the static <code class="literal">getByName()</code>
method for looking up an IP address by hostname using the system’s
<span class="emphasis"><em>name service</em></span>. (We’ll say more about <code class="literal">InetAddress</code> in the next section.) Finally,
we call the <code class="literal">DatagramPacket</code>
constructor with four arguments: the byte array containing our data,
the length of the data, the destination address object, and the port
number. We ask for the string to be encoded using the UTF-8 charset;
we’ll use the same character set to decode it.</p><p>The remaining lines construct a default client <a id="I_indexterm13_id768315" class="indexterm"/><code class="literal">DatagramSocket</code> and
call its <a id="I_indexterm13_id768326" class="indexterm"/><code class="literal">send()</code> method to
transmit the <a id="I_indexterm13_id768337" class="indexterm"/><code class="literal">DatagramPacket</code>. After
sending the datagram, we close the socket:</p><a id="I_13_tt859"/><pre class="programlisting"> <code class="n">DatagramSocket</code> <code class="n">ds</code> <code class="o">=</code> <code class="k">new</code> <code class="n">DatagramSocket</code><code class="o">();</code>
<code class="n">ds</code><code class="o">.</code><code class="na">send</code><code class="o">(</code> <code class="n">pack</code> <code class="o">);</code>
<code class="n">ds</code><code class="o">.</code><code class="na">close</code><code class="o">();</code></pre><p>Two operations throw a type of <code class="literal">IOException</code>: the <a id="I_indexterm13_id768365" class="indexterm"/><code class="literal">InetAddress.getByName()</code> lookup and the
<code class="literal">DatagramSocket send()</code> method.
<code class="literal">InetAddress.getByName()</code> can throw
an <a id="I_indexterm13_id768387" class="indexterm"/><code class="literal">UnknownHostException</code>,
which is a type of <code class="literal">IOException</code> that
indicates the hostname can’t be resolved. If <code class="literal">send()</code> throws an <code class="literal">IOException</code>, it implies a serious
client-side communication problem with the network. We need to catch
these exceptions; our <code class="literal">catch</code> block
simply prints a message telling us that something went wrong. If we
get one of these exceptions, we can assume the datagram never arrived.
However, we can’t assume the inverse: even if we don’t get an
exception, we still don’t know that the host is actually accessible or
that the data actually arrived; with a <code class="literal">DatagramSocket</code>, we never find out from the
API.<a id="I_indexterm13_id768434" class="indexterm"/><a id="I_indexterm13_id768441" class="indexterm"/></p></div><div class="sect3" title="The Pulse server code"><div class="titlepage"><div><div><h3 class="title"><a id="learnjava3-CHP-13-SECT-2.1.2"/>The Pulse server code</h3></div></div></div><p><a id="idx10764" class="indexterm"/> <a id="idx10769" class="indexterm"/> <a id="idx10791" class="indexterm"/>The <code class="literal">Pulse</code> server
corresponds to the <code class="literal">HeartBeat</code>
applet. First, it creates a <code class="literal">DatagramSocket</code> to listen on our prearranged
port. This time, we specify a port number in the constructor; we get
the port number from the command line as a string (<code class="literal">argv[0]</code>) and convert it to an integer with
<code class="literal">Integer.parseInt()</code>. Note the
difference between this call to the constructor and the call in
<code class="literal">HeartBeat</code>. In the server, we need
to listen for incoming datagrams on a prearranged port, so we need to
specify the port when creating the <code class="literal">DatagramSocket</code>. The client just sends
datagrams, so we don’t have to specify the port in advance; we build
the port number into the <code class="literal">DatagramPacket</code> itself.</p><p>Second, <code class="literal">Pulse</code> creates an
empty <code class="literal">DatagramPacket</code> of a fixed
maximum size to receive an incoming datagram. This form of the
constructor for <code class="literal">DatagramPacket</code>
takes a byte array and a length as arguments. As much data as possible
is stored in the byte array when it’s received. (A practical limit on
the size of a UDP datagram that can be sent over the Internet is 8K,
although datagrams can be larger for local network use—theoretically
up to 64K.) Finally, <code class="literal">Pulse</code> calls
the <code class="literal">DatagramSocket</code>’s <code class="literal">receive()</code> method to wait for a packet to
arrive. When a packet arrives, its contents are printed by turning
them to a string using UTF-8 encoding. We determine the actual number
of received bytes from the packet’s <code class="literal">getLength()</code> method.</p><p>As you can see, <code class="literal">DatagramSocket</code>s are slightly more tedious
than regular <code class="literal">Socket</code>s. With
datagrams, it’s harder to spackle over the messiness of the socket
interface. The Java API rather slavishly follows the Unix interface,
and that doesn’t help. But all in all, it’s not that hard to use
datagrams for simple tasks.<a id="I_indexterm13_id768611" class="indexterm"/><a id="I_indexterm13_id768618" class="indexterm"/><a id="I_indexterm13_id768625" class="indexterm"/><a id="I_indexterm13_id768632" class="indexterm"/></p></div></div><div class="sect2" title="InetAddress"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-13-SECT-2.2"/>InetAddress</h2></div></div></div><p><a id="I_indexterm13_id768646" class="indexterm"/> <a id="I_indexterm13_id768655" class="indexterm"/>The <a id="I_indexterm13_id768666" class="indexterm"/><code class="literal">java.net.InetAddress</code>
class is the lowest-level Java API for working with IP addresses.
Instances of <code class="literal">InetAddress</code> represent
individual addresses and the <code class="literal">InetAddress</code> class provides the API for using
the platform’s name service to map a string hostname to a numeric IP
address. Most of our networking examples showed the use of hostnames to
identify remote servers, but under the covers, Java utilized the static
<a id="I_indexterm13_id768694" class="indexterm"/><code class="literal">InetAddress.getByName()</code>
method to map the name to a physical IP address. Java normally uses the
DNS to perform this lookup (and it caches the results for efficiency).
Most Java networking APIs (such as Sockets) will accept either a
hostname or an <code class="literal">InetAddress</code> as a destination. The
<code class="literal">InetAddress</code> class can also be used to
perform reverse IP lookups (get a name for an IP address) as well as to
find the primary address of the local host via the static <code class="literal">InetAddress.getLocalHost()</code> method.</p><p>A useful feature of <code class="literal">InetAddress</code>
is the method <a id="I_indexterm13_id768737" class="indexterm"/><code class="literal">isReachable()</code>, which
attempts to use the ICMP <span class="emphasis"><em>ping</em></span> protocol to determine
whether a remote address can be reached over the network. The ping
protocol is the standard mechanism used to check reachability and
latency on networks. It is a low-level IP protocol (along with TCP and
UDP) and is not guaranteed to be supported everywhere. If <code class="literal">isReachable()</code> can’t use ICMP, it attempts to
use TCP to reach the echo service (port 7) on the remote host. For
example:</p><a id="I_13_tt860"/><pre class="programlisting"> <code class="n">InetAddress</code> <code class="n">server</code> <code class="o">=</code> <code class="n">InetAddress</code><code class="o">.</code><code class="na">getByName</code><code class="o">(</code><code class="s">"myserver"</code><code class="o">);</code>
<code class="n">If</code> <code class="o">(</code> <code class="o">!</code><code class="n">server</code><code class="o">.</code><code class="na">isReachable</code><code class="o">(</code> <code class="n">timeout</code> <code class="o">)</code> <code class="o">)</code> <code class="c1">// milliseconds</code>
<code class="n">pageSomeone</code><code class="o">();</code></pre></div></div></body></html>