![]() |
![]() Lecture Notes Nine: Basic Java Networking
|
We start with the minimal server.
Meanwhile, fromtucotuco.cs.indiana.edu% ls -l total 4 -rw-r--r-- 1 dgerman students 1026 Jul 22 17:20 ServerOne.java tucotuco.cs.indiana.edu% cat ServerOne.java import java.net.*; // for networking import java.io.*; // for I/O class ServerOne { // my class public static void main(String[] args) { // my main method try { // Exceptions will be thrown ServerSocket serverSocket = new ServerSocket(49900, 10); // create a ServerSocket on port 49900 process(serverSocket.accept()); // process incoming call when it comes serverSocket.close(); // close the ServerSocket } catch (Exception e) { System.out.println("Error in main: " + e); // report the Exception } } static void process(Socket incoming) { // process function receives an incoming try { // Socket object that manages the call BufferedReader in = new BufferedReader( new InputStreamReader( incoming.getInputStream())); // now I can read from it through in PrintWriter out = new PrintWriter( incoming.getOutputStream()); // and I can write to it through out out.println("Hello, this is Echo.\nEnter BYE to exit."); // initial greeting and briefing out.flush(); // make it appear immediately (flush the buffer) boolean done = false; // conversation is only starting while (!done) { // while we're not finished String str = in.readLine(); // get a line from the remote client out.println("Echo: " + str); // send it back immediately preceded by Echo: out.flush(); // make it appear immediately (flush the buffer) if (str.trim().equals("BYE")) // then check the line from the user: if BYE then done = true; // we're done } // and that's our dialoop incoming.close(); // when done hang up } catch (Exception e) { // catch the Exception System.out.println("Error in process: " + e); // report the error } } } tucotuco.cs.indiana.edu% javac ServerOne.java tucotuco.cs.indiana.edu% java ServerOne
oldschool.cs.indiana.edu
:
At this point we attempt a connection fromoldschool.cs.indiana.edu%telnet tucotuco.cs.indiana.edu 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Hello, this is Echo. Enter BYE to exit. Ha, ha, ha! Echo: Ha, ha, ha! Ha, ha! Echo: Ha, ha! Hmmm... Echo: Hmmm... Well... Echo: Well... Not a lot of creativity, don't you think? Echo: Not a lot of creativity, don't you think? Grrr... Echo: Grrr...
bobac.cs.indiana.edu
:
we only get a connection that's been queued, but can't be processed yet.bobac.cs.indiana.edu% telnet tucotuco.cs.indiana.edu 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'.
Let's finish our conversation from oldschool.cs.indiana.edu
.
OurGrrr... Echo: Grrr... Well, OK, I need to hang up now, other people are waiting, too Echo: Well, OK, I need to hang up now, other people are waiting, too See you Echo: See you BYE Echo: BYE Connection closed by foreign host. oldschool.cs.indiana.edu%
bobac.cs.indiana.edu
screen comes to life but only briefly:
Let's make a change that would keep the server up and running. Even if it cannot talk to more than one client at a time at least it can talk to the next client once it's finished with one client.bobac.cs.indiana.edu% telnet tucotuco.cs.indiana.edu 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Connection closed by foreign host. bobac.cs.indiana.edu%
So the change we need to make is marked in
#0066cc
below:
This new server has been started. We go totucotuco.cs.indiana.edu% ls ServerOne.java ServerTwo.java tucotuco.cs.indiana.edu% cat ServerTwo.java import java.net.*; import java.io.*; class ServerTwo { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(49900, 10); while (true) { process(serverSocket.accept()); } // serverSocket.close(); } catch (Exception e) { System.out.println("Error in main: " + e); } } static void process(Socket incoming) { try { BufferedReader in = new BufferedReader( new InputStreamReader( incoming.getInputStream())); PrintWriter out = new PrintWriter( incoming.getOutputStream()); out.println("Hello, this is Echo.\nEnter BYE to exit."); out.flush(); boolean done = false; while (!done) { String str = in.readLine(); out.println("Echo: " + str); out.flush(); if (str.trim().equals("BYE")) done = true; } incoming.close(); } catch (Exception e) { System.out.println("Error in process: " + e); } } } tucotuco.cs.indiana.edu% javac ServerTwo.java tucotuco.cs.indiana.edu% java ServerTwo
oldschool
and try to connect.
We try to connect fromoldschool.cs.indiana.edu% oldschool.cs.indiana.edu%telnet tucotuco.cs.indiana.edu 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Hello, this is Echo. Enter BYE to exit. Hello again, dear Echo, it is so nice to see you again. Echo: Hello again, dear Echo, it is so nice to see you again. It is indeed. Echo: It is indeed.
bobac
at this point:
So far, it's the same as before. But let's hang up onbobac.cs.indiana.edu% bobac.cs.indiana.edu% bobac.cs.indiana.edu% telnet tucotuco.cs.indiana.edu 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'.
oldschool
:
and let's watch what happens onIt is indeed. Echo: It is indeed. OK, I need to go now again, we're doing an experiment... Echo: OK, I need to go now again, we're doing an experiment... See you, bobac is on the other line Echo: See you, bobac is on the other line BYE Echo: BYE Connection closed by foreign host. oldschool.cs.indiana.edu%
bobac
:
We see that we've been queued and when time comes we get to talk to theTrying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Hello, this is Echo. Enter BYE to exit.
Echo
.
And of course, onHello, this is Echo. Enter BYE to exit. Nifty, isn't it?... Echo: Nifty, isn't it?... OK, I'll let you go... Echo: OK, I'll let you go... BYE Echo: BYE Connection closed by foreign host. bobac.cs.indiana.edu%
tucotuco
the server keeps going:
for as long as we let it run.tucotuco.cs.indiana.edu% javac ServerTwo.java tucotuco.cs.indiana.edu% java ServerTwo
Now let's maketucotuco.cs.indiana.edu% java ServerTwo ^Ctucotuco.cs.indiana.edu%
Echo
able to speak to more than one client at a time.
The part that you haven't seen before is in #0066cc
.
We've usedtucotuco.cs.indiana.edu% ls ServerOne.java ServerThree.java ServerTwo.java tucotuco.cs.indiana.edu% cat ServerThree.java import java.net.*; import java.io.*; class ServerThree { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(49900, 10); while (true) { process(serverSocket.accept()); } // serverSocket.close(); } catch (Exception e) { System.out.println("Error in main: " + e); } } static void process(Socket incoming) { Operator operator = new Operator(incoming); operator.start(); } } class Operator extends Thread { Socket incoming; Operator(Socket call) { incoming = call; } public void run() { try { BufferedReader in = new BufferedReader( new InputStreamReader( incoming.getInputStream())); PrintWriter out = new PrintWriter( incoming.getOutputStream()); out.println("Hello, this is Echo.\nEnter BYE to exit."); out.flush(); boolean done = false; while (!done) { String str = in.readLine(); out.println("Echo: " + str); out.flush(); if (str.trim().equals("BYE")) done = true; } incoming.close(); } catch (Exception e) { System.out.println("Error in process: " + e); } } } tucotuco.cs.indiana.edu% javac ServerThree.java tucotuco.cs.indiana.edu% java ServerThree
Thread
s, so we will explain them as well, on Monday.
For now let's see how ServerThree
operates.
We start it
and access it fromtucotuco.cs.indiana.edu% ls ServerOne.java ServerThree.java ServerTwo.java tucotuco.cs.indiana.edu% javac ServerThree.java tucotuco.cs.indiana.edu% java ServerThree
oldschool
and before we close that connection we also call fromoldschool.cs.indiana.edu%telnet tucotuco 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Hello, this is Echo. Enter BYE to exit. Are you really multi-threaded? Echo: Are you really multi-threaded? Let me check that Echo: Let me check that
bobac
and verify that both connections are live.bobac.cs.indiana.edu% telnet tucotuco 49900 Trying 129.79.251.110... Connected to tucotuco.cs.indiana.edu. Escape character is '^]'. Hello, this is Echo. Enter BYE to exit. I am amazed... Echo: I am amazed... Me too! Echo: Me too!
We then look at a network client, as simple as this one below.
That's as far as it goes, for basic networking.import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try { Socket con = new Socket("tucotuco.cs.indiana.edu", 49900); BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream())); PrintWriter out = new PrintWriter(con.getOutputStream(), true); for (int i = 0; i < 10; i++) { System.out.println(in.readLine()); out.println("I am " + args[0] + " " + i); out.flush(); Thread.sleep(1000); } out.println("BYE"); out.flush(); } catch (Exception e) { System.out.println("E: " + e); } } }
NC009