Java API for distributed computing
-
Upload
zeph-lawrence -
Category
Documents
-
view
31 -
download
3
description
Transcript of Java API for distributed computing
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
1
Java API for distributed computing
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
2
Two pure Java mechanisms
• Socket-based communication– Endpoints of a two-way communication
between two distributed components communicating with each other.
– Communication must be explicitly established by the two parties
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
3
Two pure Java mechanisms
• RMI– Makes the network transparent– Allows distributed component manipulation
almost as if they were on same host– Programmers do not deal with interhost
communication
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
4
Socket-based communication
• Two kinds of sockets:– Server sockets: wait for requests from clients– Client sockets: used to send data to a server socket and receive
data from it.
• Server socket listens at a specific port. • This port completely distinguishes different servers
running on the same host. • Server socket must be running on server host before any
communicating client. • After contact by client
– communication is established– Client socket is created for the app running on server
host to communicate with client.
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
5
Server socket API
• ConstructorsServerSocket(int port)
port: specifies port number at which server socket will be listening for clients
When multiple client access server socket they will be placed in a queue.
ServerSocket(int port, in backlog)
backlog specifies max length of queue.
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
6
Common server socket methods
Socket accept();Waits for connection request
Thread executing this call will be blocked until request is received, at which time returns a client socket.
void close();Stop waiting for requests from clients.
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
7
Typical code structure for server socket
try{ServerSocket server = new ServerSocket(port);for ( ; ; ){
Socket client = server.accept();// handle client …
} } catch(IOException exc) {
// handle failure to create server socket}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
8
Client socket
• An instance of the Socket class.
• Can be created one of two ways:– Using constructor:
Socket( String host, int port);– On the server side, clients sockets returned by
the accept method.
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
9
Socket communication
• Communication between server and client handled by client sockets at both ends.
• Each client socket has – an InputStream for receiving data– An OutputStream for sending data
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
10
Common socket API
InputStream getInputStream();Returns an input stream for this socket.
OutputStream getOutputStream();Returns an output stream for this socket
void close(); Closes this socket.
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
11
Typical client socket code
try{Socket client = new Socket(host, port);PrintWriter out = new PrintWriter(
new OutputStreamWriter(client.getOutputStream()));BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
// send and receive data ….
in.close();out.close();client.close();
}catch( IOException exc) {
// handle failure of connection}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
12
import java.io.*;import java.net.*;
class EchoServer { public static void main(String[] args) { System.out.println("EchoServer started."); try { ServerSocket server = new ServerSocket(8008); Socket incoming = server.accept();
System.out.println("Connected to: " + incoming.getInetAddress() +
" at port: " + incoming.getLocalPort()); BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()));
out.println("Hello! This is Java EchoServer. "); out.println("Enter BYE to exit."); out.flush();
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
13
// while (true) {
String str = in.readLine(); if (str == null) { break; // client close } else { out.println("Echo: " + str); out.flush(); System.out.println("Received: " + str); if (str.trim().equals("BYE")) break; }
}//end while incoming.close(); } catch (Exception e) { System.out.println("Error: " + e); } System.out.println("EchoServer stopped."); }//end main
}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
14
• To run a server – Enter the java command to execute it
• To run a client– Enter the command to execute client followed by name
of server host and port number where server is executing.
• You can run for test purposes server and client on same host; client invocation will look:telnet localhost 8008
Or telnet 127.0.0.1 8008
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
15
import java.io.*;import java.net.*;
class EchoClient {
public static void main(String[] args) { try { String host; if (args.length > 0 && args[0] != null) {
host = args[0]; } else {
host = "localhost"; } Socket client = new Socket(host, 8008); BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(
new OutputStreamWriter(client.getOutputStream()));
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
16
//sending data to server:for (int i = 1; i <= 10; i++) {
System.out.println("Sending: line " + i); out.println("line " + i); out.flush();
} out.println("BYE"); out.flush();
//receiving data from server: for (;;) { String str = in.readLine(); if (str == null) { break; }
else { System.out.println(str); } }//end for } catch (Exception e) { System.out.println("Error: " + e); } }//end main}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
17
A multi-echo server
• Using threads we can create sessions to handle clients.
• The session needs a reference to the client socket
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
18
import java.io.*;import java.net.*;
public class ClientHandler extends Thread {
protected Socket incoming;
public ClientHandler(Socket incoming) { this.incoming = incoming; }
public void run() { try { BufferedReader in
= new BufferedReader(new InputStreamReader(incoming.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()));
out.println("Hello! This is Java MultiEchoServer."); out.println("Enter BYE to exit."); out.flush();
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
19
for (;;) {String str = in.readLine(); if (str == null) { break; }else { out.println("Echo: " + str); out.flush(); System.out.println("Received: " + str); if (str.trim().equals("BYE")) break; }
} //end for incoming.close(); } catch (Exception e) { System.out.println("Error: " + e); } }//end run
}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
20
import java.net.*; public class MultiEchoServer {
public static void main(String[] args) { System.out.println("MultiEchoServer started."); try { ServerSocket s = new ServerSocket(8009); for (;;) {
Socket incoming = s.accept(); new ClientHandler(incoming).start();
} } catch (Exception e) { System.out.println("Error: " + e); }
System.out.println("MultiEchoServer stopped."); }}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
21
Broadcast echo server
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
22
import java.util.*;import java.io.*;import java.net.*;
class BroadcastClientHandler extends Thread {
protected Socket incoming; protected int id; protected BufferedReader in; protected PrintWriter out; public BroadcastClientHandler(Socket incoming, int id) { this.incoming = incoming; this.id = id; try { if (incoming != null) {
in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); out = new PrintWriter(new OutputStreamWriter(incoming.getOutputStream()));
} } catch (Exception e) { System.out.println("Error: " + e); } }
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
23
public synchronized void putMessage(String msg) { if (out != null) { out.println(msg); out.flush(); } }
public synchronized void broadcastClients(String str){
Enumeration enum = BroadcastEchoServer.activeThreads.elements(); while (enum.hasMoreElements()) { BroadcastClientHandler client =
(BroadcastClientHandler) enum.nextElement(); if (client != this) {
client.putMessage("Broadcast(" + id + "): " + str); } }
}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
24
public void run() { System.out.println("Client handler " + id + " started."); if (in != null && out != null) { putMessage("Hello! This is Java BroadcastEchoServer. Enter BYE to exit."); try {
for (;;) { String str = in.readLine(); if (str == null) { break; } else { // str is not null putMessage("Echo: " + str); System.out.println("Received (" + id + "): " + str); if (str.trim().equals("BYE")) { break; } else {
broadcastClients(str); } } //end else of not null str}//end forincoming.close(); BroadcastEchoServer.activeThreads.removeElement(this);
} catch (IOException e) {} } System.out.println("Client thread " + id + " stopped."); } // end run}
Spring/2002 Distributed Software EngineeringC:\unocourses\4350\slides\DefiningThreads
25
public class BroadcastEchoServer {
static protected Vector activeThreads;
public static void main(String[] args) { System.out.println("BroadcastEchoServer started."); activeThreads = new Vector(); int i = 1; try { ServerSocket s = new ServerSocket(8010); for (;;) {
Socket incoming = s.accept(); System.out.println("Spawning client thread " + i);BroadcastClientHandler newThread = new BroadcastClientHandler(incoming, i); activeThreads.addElement(newThread); newThread.start(); i++;
} } catch (Exception e) { System.out.println("Error: " + e); }
System.out.println("BroadcastEchoServer stopped."); }}