Download Java Networking

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Java Programming
Lecture 8.
Java Distributed Computing
Cheng-Chia Chen
Transparency No. 1-1
Java Networking
Distributed Computing





Network programming
JDBC
Servlets & JSPs
Remote Method Invocation (RMI)
Others not covered:




CORBA
Enterprise JavaBeans (EJB)
JINI
JavaSpaces
Transparency No. 1-2
Java Networking
Network programming
 Historically error-prone, difficult, complex
 but network programming in java is rather easy
 IO stream library works quite well for TCP/IP.
 Threading is also very useful and relatively easy here
 References:
 The java tutorial, Trail: Custom Networking
 http://java.sun.com/docs/books/tutorial/index.html
 Thinking in java, ch 15
http://www.eckelobjects.com/TIJ2/index.html.
 “Java Network Programming” by Elliotte Rusty Harold,
O’Reilly Books, 2nd Edition 2000. visit
http://www.ibooks.com for a free online reference.
Transparency No. 1-3
Java Networking
Networking Basics
 TCP/IP Network Protocol
(Peer to Peer) Protocol
interfaces
physical layer
InterNet
physical layer
Transparency No. 1-4
Java Networking
TCP and UDP
 TCP (Transmission Control Protocol) is a connection-based
protocol that provides a reliable flow of data between two
computers.
 UDP (User Datagram Protocol) is a protocol that sends
independent packets of data, called datagrams, from one
computer to another with no guarantees about arrival. UDP is
not connection-based like TCP.
Transparency No. 1-5
Java Networking
Identifying a Machine
 Uniquely identify a machine from all the others in the world
 IP (Internet Protocol) address that can exist in two forms:
 DNS (Domain Name System) form: xml.cs.nccu.edu.tw
 “Dotted quad” (IP) form: 140.119.162.230
 Represented internally by 32-bit number (4 bytes)
 4.3 billion possibilities.
 IPV6 : 128-bit coming…
 static InetAddress.getByName(String) produces Java object
containing address
Transparency No. 1-6
Java Networking
Servers & Clients




Two machines must connect
Server waits around for connection
Client initiates connection
Once the connection is made, server & client look
identical
 Both ends are turned into InputStream and
OutputStream objects, which can then be converted
to Reader and Writer objects
Client
InputStream
OutputStream
OutputStream
InputStream
server
Socket
connection (full duplex)
Transparency No. 1-7
Java Networking
Testing w/o a Network
 Here, we have no network
 Also, you may not trust your program enough yet.
 “localhost”: the “local loopback” IP address for testing
without a network
InetAddress addr = InetAddress.getByName(null);
 Equivalently:
InetAddress.getByName("localhost");
 Or using the reserved IP number for the loopback:
InetAddress.getByName("127.0.0.1");
Transparency No. 1-8
Java Networking
WhoAmI
// Finds out your network address when
// you're connected to the Internet.
import java.net.*;
public class WhoAmI {
public static void main(String[] args) throws Exception {
if(args.length != 1) {
System.err.println( "Usage: WhoAmI MachineName");
System.exit(1);
}
InetAddress a = InetAddress.getByName(args[0]);
System.out.println(a);
}}
Transparency No. 1-9
Java Networking
Port: Unique “Place” in a Machine




IP address isn’t enough to identify a unique server
Many servers can exist on one machine
IP machines also contain port numbers
When you set up client and server, you must specify IP address
and port, so they can find each other
 Not a physical location, but a software abstraction to represent
a service
 There are 65536 ports
in a machine




0-1023 reserved, others usable
80  HTTP; 110  POP3;
20,21  ftp; 25  smtp;
23  telnet, 119  nntp …
Transparency No. 1-10
Java Networking
Sockets
 Software abstraction used to represent the “terminals” of a
connection between two machines
 Java provides a class abstraction : java.io.Socket
 Socket is the actual 2-way connector. Can initiate a connection
with a server
 ServerSocket isn’t really a socket but more of a
“ServerConnector” that produces a Socket as the return value
of accept( ), which waits for a connection.
 In the end, you get a Socket on each machine
Client
InputStream
OutputStream
OutputStream
InputStream
server
Socket
connection (full duplex)
Transparency No. 1-11
Java Networking
Just Like Files...
 Once you have a Socket, you call
getInputStream( ) and getOutputStream( ) to produce the
corresponding InputStream and OutputStream objects
 You convert these to readers and writers, wrap them in a
BufferedReader or BufferedWriter and PrintWriter
 From then on, it’s like reading and writing any other IO stream!
Transparency No. 1-12
Java Networking
Simple Server & Client
//: Very simple server that just echoes whatever the client sends.
import java.io.*;
import java.net.*;
public class JabberServer {
// Choose a port outside of the range 0-1023:
public static final int PORT = 8080;
public static void main(String args[]) throws IOException {
ServerSocket s = new ServerSocket(PORT);
System.out.println("Started: " + s);
Transparency No. 1-13
Java Networking
try { // Blocks until a connection occurs:
Socket socket = s.accept();
try {
System.out.println( "Connection accepted: "+ socket);
BufferedReader in = new BufferedReader(
new InputStreamReader( socket.getInputStream()));
// Output is automatically flushed by PrintWriter:
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter
( socket.getOutputStream())),true);
Transparency No. 1-14
Java Networking
while (true) { // main server response
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
// Always close the two sockets...
} finally {
System.out.println("closing...");
socket.close(); }
} finally { s.close(); }
}}
Transparency No. 1-15
Java Networking
The client program
// Thinking in Java c15, JabberClient.java
// Very simple client that just sends lines to the server and reads lines
// that the server sends.
import java.net.*;
import java.io.*;
public class JabberClient {
public static void main(String args[]) throws IOException {
// "Local Loopback" IP address:
InetAddress addr = InetAddress.getByName(null);
System.out.println("addr = " + addr);
// Unlike ServerSocket, client needn’t specify its local port, which is allocated
dynamically by machine.
Socket socket = new Socket(addr, JabberServer.PORT);
// Guard everything in a try-finally to make sure that the socket is closed:
Transparency No. 1-16
Java Networking
try { System.out.println("socket = " + socket);
BufferedReader in = new BufferedReader( new InputStreamReader(
socket.getInputStream()));
// Output is automatically flushed by PrintWriter:
PrintWriter out = new PrintWriter( new BufferedWriter(
new OutputStreamWriter (socket.getOutputStream() ) ), true);
for(int i = 0; i < 10; i ++) {
out.println(“sending " + i);
String str = in.readLine();
System.out.println(str);
}
out.println("END");
} finally { System.out.println("closing...");
socket.close();}
} }
Transparency No. 1-17
Java Networking
Serving Multiple Clients via Threads
// A server that uses multithreading to handle any number of clients.
import java.io.*;
import java.net.*;
class ServeOneJabber extends Thread {
private Socket socket; private BufferedReader in;
private PrintWriter out;
public ServeOneJabber(Socket s) throws IOException {
socket = s;
in = new BufferedReader( new InputStreamReader
(socket.getInputStream()));
// Enable auto-flush:
out = new PrintWriter(new BufferedWriter( new OutputStreamWriter
( socket.getOutputStream())), true);
// If any of the above calls throw an exception, the caller is responsible
// for closing the socket. Otherwise the thread will close it.
start(); // Calls run()
}
Transparency No. 1-18
Java Networking
public void run() {
try {
while (true) {
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
System.out.println("closing...");
} catch (IOException e) { }
finally { try {socket.close(); } catch(IOException e) {} }
} }
Transparency No. 1-19
Java Networking
MultiJabberServer
public class MultiJabberServer { static final int PORT = 8080;
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);
System.out.println("Server Started");
try {
while(true) {
// wait for a connection established:
Socket socket = s.accept();
try { new ServeOneJabber(socket); }
catch(IOException e) {
// If it fails, close the socket, otherwise the thread will close it:
socket.close(); }
}
} finally { s.close(); }
} }
Transparency No. 1-20
Java Networking
JabberClientThread
// Client that tests the MultiJabberServer by starting up multiple clients.
import java.net.*; import java.io.*;
class JabberClientThread extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private static int counter = 0;
private int id = counter++; private static int threadcount = 0;
public static int threadCount() { return threadcount; }
public JabberClientThread(InetAddress addr) {
System.out.println("Making client " + id);
threadcount++;
try { socket = new Socket(addr, MultiJabberServer.PORT);
} catch(IOException e) {
// If the creation of the socket fails, nothing needs to be cleaned up.
}
Transparency No. 1-21
Java Networking
try { in = new BufferedReader( new InputStreamReader
( socket.getInputStream()));
// Enable auto-flush:
out = new PrintWriter( new BufferedWriter(
new OutputStreamWriter( socket.getOutputStream())), true);
start();
} catch(IOException e) {
// The socket should be closed on any failures other than the socket
// constructor:
try { socket.close(); } catch(IOException e2) {}
}
// Otherwise the socket will be closed by
// the run() method of the thread.
}
Transparency No. 1-22
Java Networking
public void run() {
try {
for(int i = 0; i < 25; i++) {
out.println("Client " + id + ": " + i);
String str = in.readLine();
System.out.println(str);
}
out.println("END");
}
catch(IOException e) {}
finally { // Always close it:
try { socket.close();}
catch(IOException e) {}
threadcount--; // Ending this thread
} } }
Transparency No. 1-23
Java Networking
MultiJabberClient
public class MultiJabberClient {
static final int MAX_THREADS = 40;
public static void main(String[] args)
throws IOException, InterruptedException {
InetAddress addr =
InetAddress.getByName(null);
while(true) {
if(JabberClientThread.threadCount() < MAX_THREADS)
new JabberClientThread(addr);
Thread.currentThread().sleep(100); // Why not just sleep(100)?
} } }
Transparency No. 1-24
Java Networking
User Datagram Protocol (UDP)
 Previous examples used Transmission Control Protocol
(TCP).
 Very high reliability, message will always get there.
 Also high overhead
 User Datagram Protocol (UDP) is an unreliable protocol
which is much faster, but the messages won’t always
get there
Transparency No. 1-25
Java Networking
Datagrams
 You make your own packets and write the address on
the outside, send it
 Based on packet contents, recipient decides whether
they got everything, sends a message if they didn’t, you
retransmit
 Reliability must be enforced by your program, not by
the UDP protocol
 two principal classes supplied in java.net package for
UDP.
 DatagramPacket : for encapsulating sent/received packets
 DatagramSocket : for encapsulating send/receive terminals.
Transparency No. 1-26
Java Networking
the class DatagramPacket
 public final class DatagramPacket extends Object {
// constructors: 1. for receiving; 2. for transmission
public DatagramPacket(byte[] buf, int size) // size ≥ buf.length
pubic DatagramPacket(byte[], int, InetAddress, int port)
// public methods
InetAddress getAddress();
byte[] getData();
int getLength();
int getPort();
}
Transparency No. 1-27
Java Networking
The DatagramSocket class
pubic final DatagramSocket { // constructors
public DatagramSocket([int port [,InetAddress localaddr]]) throws
SocketException // port selected by system if not supplied
// public methods
void close();
InetAddress getLocalAddress();
int getLocalPort();
synchronized void receive(DatagramPacket p) throws IOException;
void send(DatagramPacket p) throws IOException
// int Property : SoTimeout
synchronized void setSoTimeout(int) / int getSoTimeout() throws
SocketException
Transparency No. 1-28
Java Networking
Example for asking daytime
int PORT_DAYTIME = 13;
msg = new byte[256];
dgSocket = new DatagramSocket();
dest = InetAddress.getByName(“cherry.cs.nccu.edu.tw”);
dg = new DatagramPacket(msg, msg.length, dest,
PORT_DAYTIME);
dgSocket.send(dg);
dg = new DatagramPacket(msg, msg.length);
dgSocket.receive(dg);
time = new String(dg.getData());
print(“The time in Taipei is now : “ + time );
dgSocket.close();
Transparency No. 1-29
Java Networking
Port Warning
 Problem: program works fine, except when client is
behind a firewall
 Firewall doesn’t like to see anything but ordinary
network connections to WWW server via its standard
http port 80
 Servlets solve the problem
Transparency No. 1-30
Java Networking
Access resources via URLs
 What Is a URL ?
 an acronym for Uniform Resource Locator
 is a reference (an address) to a resource on the Internet.
 Format:
 scheme : [// [host [:port]]] [ path [reference]]
 EXs:





http://www.cs.nccu.edu.tw
http://xml.cs.nccu.edu.tw/Courses/java2000/index.html#loc2
ftp://java.sun.com/pub/
http://java.sun.com/servlet/app1?user=chen+passwd=****
file:///D:/chencc/java2000/index.html
Transparency No. 1-31
Java Networking
Creating a URL
 Direct from URL address




String j2k = http://xml.cs.nccu.edu.tw/Courses/java/Java2001;
URL j2001 = new URL(j2k); // or
URL j2001 = new URL
(“http”, “xml.cs.nccu.edu.tw”, “Courses/java/Java2001”);
 Relative to another URL address
 String coursesLoc = http://xml.cs.nccu.edu.tw/Courses/index.html
 URL coursesURL = new URL(coursesLoc);
 URL j2001 = new URL(coursesURL, “java/Java2000/index.html”);
 Constructor Summary
 URL(String spec)
 URL(String scheme, String host [, int port] , String file [,
URLStreamHandler h])
 URL(URL baseURL, String relativeURL [,URLStreamHandler] )
 possible exception: MalformedURLException
Transparency No. 1-32
Java Networking
Parsing a URL
 getProtocol
 Returns the protocol identifier component of the URL.
 getHost
 Returns the host name component of the URL.
 getPort
 Returns the port number component of the URL.
 The getPort method returns an integer that is the port number.
 If the port is not set, getPort returns -1.
 getFile
 Returns the filename component of the URL.
 getRef
 Returns the reference component of the URL.
Transparency No. 1-33
Java Networking
Example
import java.net.*;
import java.io.*;
public class ParseURL {
public static void main(String[] args) throws Exception {
URL aURL = new URL("http://java.sun.com:80/docs/books/"
+ "tutorial/index.html#DOWNLOADING");
System.out.println("protocol = " + aURL.getProtocol());
System.out.println("host = " + aURL.getHost());
System.out.println("filename = " + aURL.getFile());
System.out.println("port = " + aURL.getPort());
System.out.println("ref = " + aURL.getRef()); } }
 Here's the output displayed by the program:
protocol = http
host = java.sun.com
filename = /docs/books/tutorial/index.html
port = 80
ref = DOWNLOADING
Transparency No. 1-34
Java Networking
Reading Directly from a URL
 InputStream openStream(); // return a stream for reading
 EX:
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader( new
InputStreamReader( yahoo.openStream())
);
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Transparency No. 1-35
Java Networking
Connecting to a URL
 URLConnection openConnectino() throws IOException;
 EX:
try {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yahooConnection = yahoo.openConnection();
} catch (MalformedURLException e) { // new URL() failed
...
} catch (IOException e) {
// openConnection() failed
...
}
Transparency No. 1-36
Java Networking
Reading from and Writing to a URLConnection
 Reading from a URLConnection
// like direct reading from URL using openStream()
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Transparency No. 1-37
Java Networking
Writing to a URLConnection
 procedures
1.Create a URL.
2.Open a connection to the URL.
3.Set output capability on the URLConnection.
4.Get an output stream from the connection. This output stream is
connected to the standard input stream of the cgi-bin script on the
server.
 5.Write to the output stream.
 6.Close the output stream.




Transparency No. 1-38
Java Networking
String stringToReverse = URLEncoder.encode(args[0]);
URL url = new URL("http://java.sun.com/cgi-bin/backwards");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(
connection.getOutputStream());
out.println("string=" + stringToReverse);
out.close();
BufferedReader in = new BufferedReader( new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) System.out.println(inputLine);
in.close();
Transparency No. 1-39
Java Networking
JDBC
 Java DataBase Connectivity
 Allows you to write SQL without worrying about
what brand of database you’re connecting to
 Provides a simple interface for database
programming
Transparency No. 1-40
Java Networking
JDBC database URL
 A string used to identify data source ( and parameters)
 The format:
 jdbc: <subprotocol> : <otherStuff>
 “jdbc” means using JDBC
 <subprotocol>: the name of the driver or the name of a database
connectivity mechanism.
 <otherStuff> : the database identifier. This varies with the
database driver used.
 the first subprotocol available is the “jdbc-odbc bridge,”
specified by “odbc”
 EX: String dbUrl =
"jdbc:odbc://whitehouse.gov:5000/CATS;PWD=Hillary";
Transparency No. 1-41
Java Networking
//: c15:Lookup.java
// Looks up email addresses in a local database using JDBC
import java.sql.*;
public class Lookup {
public static void main(String args[]) {
String dbUrl = "jdbc:odbc:people";
String user = ""; String password = "";
try { // Load the driver (registers itself)
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver");
Connection c = DriverManager.getConnection
( dbUrl, user, password);
Statement s = c.createStatement();
Transparency No. 1-42
Java Networking
// SQL code:
ResultSet r = s.executeQuery(
"SELECT FIRST, LAST, EMAIL FROM people.csv people " +
"WHERE (LAST='" + args[0] + "') " + " AND (EMAIL Is Not Null)
" + "ORDER BY FIRST");
while(r.next()) { // Capitalization doesn't matter:
System.out.println( r.getString("Last") + ", " +
r.getString("fIRST") + ": " + r.getString("EMAIL") );
} } catch(Exception e) { e.printStackTrace(); }
}}
Transparency No. 1-43
Java Networking
Servlets
 Servlets are to servers what applets are to browsers
 Servlet API (a standard Java extension) is truly crossplatform
 Substitute for CGI scripts
 Easier to write, faster to run
 Not tied to any platform-specific API
 Better than CGI scripts
 Stay resident: speed, persistent
 information
 Multithreading locks prevent collisions
 Session tracking built in
Transparency No. 1-44
Java Networking
Running servlets locally
 Download the Tomcat implementation of Java Servlets
and JSPs




http://jakarta.apache.org
Official Servlet/JSP distribution
Free! Part of Apache project
Will eventually be integrated into Apache to make it a true
application server
 Execute Tomcat.bat start
Transparency No. 1-45
Java Networking
Works with both GET & POST
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ServletsRule extends HttpServlet {
int i = 0;
// Servlet "persistence"
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
PrintWriter out = res.getWriter();
out.print("<HEAD><TITLE>");
out.print("A server-side strategy");
out.print("</TITLE></HEAD><BODY>");
out.print("<h1>Servlets Rule! " + i++);
out.print("</h1></BODY>");
out.close(); } }
Transparency No. 1-46
Java Networking
Easy to get HTML form data
// Dumps the name-value pairs of any HTML form
import javax.servlet.*; import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class EchoForm extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.print("<h1>Your form contained:</h1>");
Enumeration flds = req.getParameterNames();
while(flds.hasMoreElements()) { String field = (String)flds.nextElement();
String value = req.getParameter(field);
out.print(field + " = " + value + "<br>");
}
out.close(); }
Transparency No. 1-47
Java Networking
public void doPost(HttpServletRequest req, HttpServletResponse
res) throws IOException {
doGet(req, res);
}}
Transparency No. 1-48
Java Networking
One servlet, thread-per-request
import javax.servlet.*; import javax.servlet.http.*;
import java.io.*;
public class ThreadServlet extends HttpServlet {
int i;
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
synchronized( this) {
try { Thread.currentThread().sleep(5000); }
catch( InterruptedException e) {}
}
out.print("<h1>Finished " + i++ + "</h1>");
out.close(); } }
Transparency No. 1-49
Java Networking
Java Server Pages (JSPs)
 Servlets still require web pages
 Why not combine only the essential servlet code with
the HTML code?
 Why not minimize the Java code you have to write?
 Inspired by ASPs but much nicer
 The easiest way to experiment with servlet properties
 You can include special servlets, calls to Java libraries,
etc.
Transparency No. 1-50
Java Networking
Java Server Web Dev Kit
 From java.sun.com, exceptionally easy to install and
run
 All you do is put .jsp files in the appropriate directory,
point your web browser at them
 JSP is automatically built, compiled and loaded on the
first call, just like a servlet
Transparency No. 1-51
Java Networking
Most code is built for you
<html><body> <H1>The time in seconds is:
<%= System.currentTimeMillis()/1000 %>
</H1> </body></html>
 Plenty of Java code is produced, +HTML
 The ‘<%=’ coerces the resulting expression to a String
 Code automatically rebuilt & recompiled when JSP
source file changes
Transparency No. 1-52
Java Networking
Basic JSP operations
<%-- This JSP comment will not appear in the generated html --%>
<%-- This is a JSP directive: --%>
<%@ page import="java.util.*" %>
<%-- These are declarations: --%>
<%!
long loadTime= System.currentTimeMillis();
Date loadDate = new Date();
int hitCount = 0;
%>
<html><body>
<%-- The next several lines are the result of a JSP expression inserted in the
generated html; the '=' indicates a JSP expression --%>
<H1>This page was loaded at <%= loadDate %> </H1>
Transparency No. 1-53
Java Networking
<H1>Hello, world! It's <%= new Date() %></H1>
<H2>Here's an object: <%= new Object() %></H2>
<H2>This page has been up <%= (System.currentTimeMillis()loadTime)/1000 %> seconds</H2>
<H3>Page has been accessed <%= ++hitCount %> times since
<%= loadDate %></H3>
<%-- A "scriptlet" which writes to the server console. Note that a ';'
is required: --%>
<% System.out.println("Goodbye"); out.println("Cheerio"); %>
</body></html>
Transparency No. 1-54
Java Networking
Extracting fields and values
 You can mix Java code & HTML
 An “if” statement can print HTML in its body
<%-- Fetching the data from an HTML form --%>
<%-- Also generates the form --%>
<%@ page import="java.util.*" %>
<html><body> <H1>DisplayFormData</H1><H3>
<% Enumeration f = request.getParameterNames();
if(!f.hasMoreElements()) { // No fields
%>
<form method="POST" action="DisplayFormData.jsp">
<% for(int i = 0; i < 10; i++) { %>
Field<%=i%>: <input type="text" size="20" name="Field<%=i%>"
value="Value<%=i%>"><br> <% } %>
Transparency No. 1-55
Java Networking
<INPUT TYPE=submit name=submit Value="Submit"> </form>
<% } %>
<%
Enumeration flds = request.getParameterNames();
while(flds.hasMoreElements()) {
String field = (String)flds.nextElement();
String value = request.getParameter(field);
%>
<li> <%= field %> = <%= value %> </li>
<% } %>
</H3></body></html>
Transparency No. 1-56
Java Networking
Remote Method Invocation (RMI)
 Basic idea: the network of computers becomes the
computing platform
 Objects can live on other computers
 You can invoke methods on those objects, passing them
object arguments, and they can return objects
 Network connections and JDBC are particular ways to
compute across the network, RMI is the general
solution
Transparency No. 1-57
Java Networking
1) Make a Remote Interface
//: Thinking in Java, ch15:rmi: PerfectTimeIF.java
// The PerfectTime remote interface.
package c15.rmi;
import java.rmi.*;
interface PerfectTimeIF extends Remote {
long getPerfectTime() throws RemoteException;
}
Transparency No. 1-58
Java Networking
2) Create the Remote class
 Create and install
RMISecurityManager
 Create one or more instances of a remote object
 Register at least one of the remote objects with the RMI
remote object registry, for bootstrapping purposes
Transparency No. 1-59
Java Networking
//: c15:rmi:PerfectTime.java
// The implementation of the PerfectTimeIF remote object.
package c15.rmi;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
public class PerfectTime extends UnicastRemoteObject implements
PerfectTimeIF {
// Implementation of the interface:
public long getPerfectTime() throws RemoteException {
return System.currentTimeMillis(); }
// Must implement constructor to throw RemoteException:
public PerfectTime() throws RemoteException {
// super() Called automatically
}
Transparency No. 1-60
Java Networking
// Registration for RMI serving:
public static void main(String[] args) {
System.setSecurityManager( new RMISecurityManager());
try {
PerfectTime pt = new PerfectTime();
Naming.bind( "//peppy:2005/PerfectTime", pt);
System.out.println("Ready to do time");
}catch(Exception e) { e.printStackTrace(); }
}}
Transparency No. 1-61
Java Networking
Starting The Registry
 At default port 1099:
 start rmiregistry (Win95)
 rmiregistry & (Unix)
 At specified port:
 start rmiregistry 2005 (Win95)
 rmiregistry 2005 & (Unix)
Transparency No. 1-62
Java Networking
Creating Stubs & Skeletons
 Must specify location starting from the class path:
rmic c15.rmi.PerfectTime
 This produces:
PerfectTime_Stub.class
PerfectTime_Skel.class
 Now your RMI program can work
Transparency No. 1-63
Java Networking
3) Use the Remote Object
//: c15:rmi:DisplayPerfectTime.java
package c15.rmi;
import java.rmi.*;
import java.rmi.registry.*;
public class DisplayPerfectTime {
public static void main(String[] args){
System.setSecurityManager( new RMISecurityManager());
try {
PerfectTimeI t = (PerfectTimeI) Naming.lookup
( "//peppy:2005/PerfectTime");
for(int i = 0; i < 10; i++)
System.out.println("Perfect time = " + t.getPerfectTime());
} catch(Exception e) { e.printStackTrace(); }
}}
Transparency No. 1-64
Java Networking
Problem 3
 Use Socket to implement a simple file transfer client/server
1. server-side : SftpServer
1. has a userdata.cfg file, each line of which records a user information
including: user-name, pass-word and user’s home directory
2. Each user can get/put files on his home directory (and subdirectory)
3. there is a global uploading directory ( say incoming ) to which every
user can put files
4. there is a global directory ( say pub) from which every user can get
files.
5. to handle simultaneous request of multi users, your server must be
multithreaded.
2. Client-side : SftpClient
Transparency No. 1-65
Java Networking




pubic class SftpClient {
// constructor
public SftpClient(String ip, String port, String user, String passw)
get(String remoteFilePathName, String localFileName) throws
IOException, remoteFileNotFound;
 put(String remoteFilePathName, String localFileName) throws
IOException, RemoteFileNotWritable;
 pubic static void main(String[] args ) { }
Transparency No. 1-66
Java Networking
usage of SftpClient
 java SftpClient Option* {get | put } remotefileName [localName]
 Where Option is any of
 -server ip:port
 -terminate
-user username:passwd
Exs:
> java SftpClient –server 140.119.162.230:2021 –user chencc:123456
get pub/java2000.html D:/temp/java2000.html
> java SftpClient –server xml.cs.nccu.edu.tw:2021 –user test:1111
put incoming/test1.txt test1.txt
 Run the batch to test your client:
Transparency No. 1-67
Java Networking
Problem3Test.bat
Rem launch the server at port 2021
java SftpServer –port 2021
Rem get the file pub/test1.txt from the server
java SftpClient -server localhost:2021 –user test:1111 get
pub/test1.txt c:\temp\test1.txt
Rem put the file c:\temp\test2.txt to server
java SftpClient –server 127.0.0.1:2021 –user test:1111 put
incoming/test2.txt c:\temp\test2.txt
Rem terminate the server
java SftpClient –server 127.0.0.1:2021 –user root:1111 -terminate
Transparency No. 1-68