lecture 8. java distributed computing

82
Java Programming Transparency No. 1-1 Lecture 8. Java Distributed Computing Cheng-Chia Chen

Upload: kerry-grimes

Post on 02-Jan-2016

53 views

Category:

Documents


0 download

DESCRIPTION

Lecture 8. Java Distributed Computing. Cheng-Chia Chen. Distributed Computing. Network programming JDBC Servlets & JSPs Remote Method Invocation (RMI) Others not covered: CORBA Enterprise JavaBeans (EJB) JINI JavaSpaces. Network programming. - PowerPoint PPT Presentation

TRANSCRIPT

Java Programming

Transparency No. 1-1

Lecture 8. Java Distributed Computing

Cheng-Chia Chen

Java Networking

Transparency No. 1-2

Distributed Computing

Network programming JDBC Servlets & JSPs Remote Method Invocation (RMI) Others not covered:

CORBA Enterprise JavaBeans (EJB) JINI JavaSpaces

Java Networking

Transparency No. 1-3

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/i

ndex.html. “Java Network Programming” by Elliotte Rusty Harold, O’

Reilly Books, 2nd Edition 2000. visit http://www.ibooks.com for a free online reference.

Java Networking

Transparency No. 1-4

Networking Basics

TCP/IP Network Protocol

physical layer physical layer InterNet InterNet

(Peer to Peer) Protocol

interfaces

Java Networking

Transparency No. 1-5

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.

Java Networking

Transparency No. 1-6

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

Java Networking

Transparency No. 1-7

Servers & Clients

Two machines must connect Server waits around for connection Client initiates connection Once the connection is made, server & client look id

entical Both ends are turned into InputStream and OutputSt

ream objects, which can then be converted to Reader and Writer objects

Client server

connection (full duplex)

Socket

InputStream

InputStream OutputStream

OutputStream

Java Networking

Transparency No. 1-8

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");

Java Networking

Transparency No. 1-9

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); } }

Java Networking

Transparency No. 1-10

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 …

Port: Unique “Place” in a Machine

Java Networking

Transparency No. 1-11

Sockets Software abstraction used to represent the “terminals” of a con

nection 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 “ServerConnec

tor” 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 server

connection (full duplex)Socket

InputStream

InputStream OutputStream

OutputStream

Java Networking

Transparency No. 1-12

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!

Java Networking

Transparency No. 1-13

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);

Java Networking

Transparency No. 1-14

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())),tr

ue);

Java Networking

Transparency No. 1-15

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(); } } }

Java Networking

Transparency No. 1-16

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:

Java Networking

Transparency No. 1-17

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();}} }

Java Networking

Transparency No. 1-18

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. }

Java Networking

Transparency No. 1-19

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) {} } } }

Java Networking

Transparency No. 1-20

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).start(); } catch(IOException e) { // If it fails, close the socket, otherwise the thread will close it: socket.close(); } } } finally { s.close(); } } }

Java Networking

Transparency No. 1-21

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. }

Java Networking

Transparency No. 1-22

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. }

Java Networking

Transparency No. 1-23

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 } } }

Java Networking

Transparency No. 1-24

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)?

} } }

Java Networking

Transparency No. 1-25

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

Java Networking

Transparency No. 1-26

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

c.f.: TCP Telephone system UDP postal service

Java Networking

Transparency No. 1-27

Datagrams

You make your own packets and write the address on the outside, send it

Based on packet contents, recipients decide whether they got everything, sends a message if they didn’t, and you retransmit in that case.

Reliability must be enforced by your program, not by the UDP protocol

Java APIs provided in two classes: java.net.DatagramPacket java.net.DatagramSocket

Java Networking

Transparency No. 1-28

DatagramPacket

Encapsulation of data(packet) to be received/transmitted and related information.

Constructors: // for receiving packets DatagramPacket(byte[] data [ [, int offset] , int length]) // for sending packets DatagramPacket(byte[] data [ [, int offset], int length], InetAddress ia ,int port )

Java Networking

Transparency No. 1-29

DatagramPacket Methods

InetAddress getAddress() Returns the IP address of the peer machine.

 byte[] getData() Returns the data buffer. int getLength() Returns the length of the data. int getOffset()  Returns the offset of the data to be sent/received. int getPort()   Returns the port number on the remote host. SocketAddress getSocketAddress()

Gets the SocketAddress (usually IP address + port number) of the remote host.

void setAddress(InetAddress iaddr)    void setData(byte[] buf [, int offset, int length])        void setLength(int length)       void setPort(int iport)void setSocketAddress(SocketAddress )

Java Networking

Transparency No. 1-30

DatagramSocket

represents a socket for sending and receiving datagram packets Constructor

// bind to local IP laddr and port port or local SocketAddr bindaddr // info not given => allocated by machine DatagramSocket([ int port [,InetAddress laddr]] ) DatagramSocket(SocketAddress bindaddr )

Methods // for local info manipulation void bind(SocketAddress), isBound(), getLocalAddress(), getLocalPort(), getLocalSocketAddress()

Java Networking

Transparency No. 1-31

// for remote info manipulation // dedicated to this remote socket address only connect(InetAddress, int), connect(SocketAddress), disconnect(), isConnected() : // return null/-1 if not connected. getInetAddress(), getPort(), getRemoteSocketAddress()

//send/receive data send(DatagramPacket) receive(DatagramPacket)

// others isClosed() getBroadcast(), setBroadcast(boolean), getSoTimeout(), setSoTimeout(int),…

Java Networking

Transparency No. 1-32

Example UDP programming: The client side program

Java Networking

Transparency No. 1-33

// Fig. 18.7: Client.java

// Client that sends and receives packets to/from a server.

import java.io.*; import java.net.*; import java.awt.*;

import java.awt.event.*; import javax.swing.*;

public class Client extends JFrame {

private JTextField enterField; private JTextArea displayArea;

private DatagramSocket socket;

// set up GUI and DatagramSocket

public Client()

{ super( "Client" );

Container container = getContentPane();

enterField = new JTextField( "Type message here" );

enterField.addActionListener(

new ActionListener() {

public void actionPerformed( ActionEvent event )

{

Java Networking

Transparency No. 1-34

// create and send packet

try {

displayArea.append( "\nSending packet containing: " + event.getActionCommand() + "\n" );

// get message from textfield and convert to byte array

String message = event.getActionCommand();

byte data[] = message.getBytes(); // create sendPacket

DatagramPacket sendPacket = new DatagramPacket( data,

data.length, InetAddress.getLocalHost(), 5000 );

socket.send( sendPacket ); // send packet

displayArea.append( "Packet sent\n" );

displayArea.setCaretPosition( displayArea.getText().length() );

} // process problems creating or sending packet

catch ( IOException ioException ) { displayMessage( ioException.toString() + "\n" );

ioException.printStackTrace(); }

Java Networking

Transparency No. 1-35

} // end actionPerformed

} // end inner class

); // end call to addActionListener

container.add( enterField, BorderLayout.NORTH );

displayArea = new JTextArea();

container.add( new JScrollPane( displayArea ), BorderLayout.CENTER );

setSize( 400, 300 ); setVisible( true );

// create DatagramSocket for sending and receiving packets

try {

socket = new DatagramSocket(); }

// catch problems creating DatagramSocket

catch( SocketException socketException ) {

socketException.printStackTrace();

System.exit( 1 );

}

Java Networking

Transparency No. 1-36

} // end Client constructor

// wait for packets to arrive from Server, display packet contents

private void waitForPackets()

{ while ( true ) { // loop forever

// receive packet and display contents

try { // set up packet

byte data[] = new byte[ 100 ];

DatagramPacket receivePacket = new DatagramPacket( data, data.length );

socket.receive( receivePacket ); // wait for packet

// display packet contents

displayMessage( "\nPacket received:" +

"\nFrom host: " + receivePacket.getAddress() +

"\nHost port: " + receivePacket.getPort() +

"\nLength: " + receivePacket.getLength() +

"\nContaining:\n\t" + new String( receivePacket.getData(),

0, receivePacket.getLength() ) );

}

Java Networking

Transparency No. 1-37

// process problems receiving or displaying packet

catch( IOException exception ) {

displayMessage( exception.toString() + "\n" );

exception.printStackTrace();

} } // end while

} // end method waitForPackets

// utility method called from other threads to manipulate

// displayArea in the event-dispatch thread

private void displayMessage( final String messageToDisplay )

{ // display message from event-dispatch thread of execution

SwingUtilities.invokeLater(

new Runnable() { // inner class to ensure GUI updates properly

public void run() // updates displayArea

{ displayArea.append( messageToDisplay );

displayArea.setCaretPosition( displayArea.getText().length() );

}

Java Networking

Transparency No. 1-38

} // end inner class

); // end call to SwingUtilities.invokeLater

}

public static void main( String args[] )

{

Client application = new Client();

application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

application.waitForPackets();

}

} // end class Client

Java Networking

Transparency No. 1-39

The server side program

Java Networking

Transparency No. 1-40

// Fig. 18.6: Server.java

// Server that receives and sends packets from/to a client.

import java.io.*; import java.net.*; import java.awt.*;

import java.awt.event.*; import javax.swing.*;

public class Server extends JFrame {

private JTextArea displayArea; private DatagramSocket socket;

// set up GUI and DatagramSocket

public Server()

{ super( "Server" );

displayArea = new JTextArea();

getContentPane().add( new JScrollPane( displayArea ), BorderLayout.CENTER );

setSize( 400, 300 ); setVisible( true );

// create DatagramSocket for sending and receiving packets

try {

socket = new DatagramSocket( 5000 );

}

Java Networking

Transparency No. 1-41

// process problems creating DatagramSocket

catch( SocketException socketException ) {

socketException.printStackTrace();

System.exit( 1 );

}

} // end Server constructor

// wait for packets to arrive, display data and echo packet to client

private void waitForPackets()

{

while ( true ) { // loop forever

// receive packet, display contents, return copy to client

try { // set up packet

byte data[] = new byte[ 100 ];

DatagramPacket receivePacket = new DatagramPacket( data, data.length );

socket.receive( receivePacket ); // wait for packet

Java Networking

Transparency No. 1-42

// display information from received packet

displayMessage( "\nPacket received:" +

"\nFrom host: " + receivePacket.getAddress() +

"\nHost port: " + receivePacket.getPort() +

"\nLength: " + receivePacket.getLength() +

"\nContaining:\n\t" + new String( receivePacket.getData(),

0, receivePacket.getLength() ) );

sendPacketToClient( receivePacket ); // send packet to client } // process problems manipulating packet

catch( IOException ioException ) {

displayMessage( ioException.toString() + "\n" );

ioException.printStackTrace();

} } // end while

} // end method waitForPackets

// echo packet to client

private void sendPacketToClient( DatagramPacket receivePacket ) throws IOException

{

Java Networking

Transparency No. 1-43

displayMessage( "\n\nEcho data to client..." );

// create packet to send

DatagramPacket sendPacket = new DatagramPacket(

receivePacket.getData(), receivePacket.getLength(),

receivePacket.getAddress(), receivePacket.getPort() );

socket.send( sendPacket ); // send packet displayMessage( "Packet sent\n" );

}

// utility method called from other threads to manipulate

// displayArea in the event-dispatch thread

private void displayMessage( final String messageToDisplay )

{ // display message from event-dispatch thread of execution

SwingUtilities.invokeLater(

new Runnable() { // inner class to ensure GUI updates properly

public void run() // updates displayArea

{ displayArea.append( messageToDisplay );

displayArea.setCaretPosition( displayArea.getText().length() );

}

Java Networking

Transparency No. 1-44

} // end inner class

); // end call to SwingUtilities.invokeLater

}

public static void main( String args[] )

{

Server application = new Server();

application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

application.waitForPackets();

}

} // end class Server

Java Networking

Transparency No. 1-45

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/java2002/index.html#loc2 ftp://java.sun.com/pub/ http://java.sun.com/servlet/app1?user=chen+passwd=**** file:///D:/chencc/java2002/index.html

Java Networking

Transparency No. 1-46

Creating a URL

Direct from URL address String j2k = “http://xml.cs.nccu.edu.tw/Courses/java2000”; URL j2000 = new URL(j2k); // or URL j2000 = new URL (“http”, “xml.cs.nccu.edu.tw”, “Courses/java2000”);

Relative to another URL address String coursesLoc = “http://xml.cs.nccu.edu.tw/Courses/index.html” URL coursesURL = new URL(coursesLoc); URL j2000 = new URL(coursesURL, “java2002/index.html”);

Constructor Summary URL(String spec) URL(String scheme, String host [, int port] , String file [, URLStreamHan

dler h]) URL(URL baseURL, String relativeURL [,URLStreamHandler] ) possible exception: MalformedURLException

Java Networking

Transparency No. 1-47

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.

Java Networking

Transparency No. 1-48

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

Java Networking

Transparency No. 1-49

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();

Java Networking

Transparency No. 1-50

Connecting to a URL

URLConnection openConnection() 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

. . .

}

Java Networking

Transparency No. 1-51

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();

Java Networking

Transparency No. 1-52

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 con

nected to the standard input stream of the cgi-bin script on the server. 5.Write to the output stream. 6.Close the output stream.

Java Networking

Transparency No. 1-53

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();

Java Networking

Transparency No. 1-54

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 program

ming

Java Networking

Transparency No. 1-55

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 datab

ase driver used. the first subprotocol available is the “jdbc-odbc bridge,” specifi

ed by “odbc” EX: String dbUrl = "jdbc:odbc://whitehouse.gov:5000/CATS;PW

D=Hillary";

Java Networking

Transparency No. 1-56

//: c15:Lookup.java // Looks up email addresses in a local database using JDBCimport 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();

Java Networking

Transparency No. 1-57

// 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(); }

} }

Java Networking

Transparency No. 1-58

Servlets

Servlets are to servers what applets are to browsers Servlet API (a standard Java extension) is truly cross-pl

atform 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

Java Networking

Transparency No. 1-59

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 ap

plication server

Execute Tomcat.bat start

Java Networking

Transparency No. 1-60

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) throw

s 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(); } }

Java Networking

Transparency No. 1-61

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(); }

Java Networking

Transparency No. 1-62

public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {

doGet(req, res);

} }

Java Networking

Transparency No. 1-63

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) throw

s 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(); } }

Java Networking

Transparency No. 1-64

Java Server Pages (JSPs)

Servlets still require web pages Why not combine only the essential servlet code with th

e 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.

Java Networking

Transparency No. 1-65

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

Java Networking

Transparency No. 1-66

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

Java Networking

Transparency No. 1-67

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>

Java Networking

Transparency No. 1-68

<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>

Java Networking

Transparency No. 1-69

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> <% } %>

Java Networking

Transparency No. 1-70

<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>

Java Networking

Transparency No. 1-71

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

Java Networking

Transparency No. 1-72

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;

}

Java Networking

Transparency No. 1-73

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

Java Networking

Transparency No. 1-74

//: 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 PerfectTi

meIF { // 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 }

Java Networking

Transparency No. 1-75

// 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(); }

} }

Java Networking

Transparency No. 1-76

Starting The Registry

At default port 1099: start rmiregistry (Win) rmiregistry & (Unix)

At specified port: start rmiregistry 2005 (Win) rmiregistry 2005 & (Unix)

Java Networking

Transparency No. 1-77

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

Java Networking

Transparency No. 1-78

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 {

PerfectTimeIF t = (PerfectTimeIF) Naming.lookup ( "//peppy:2005/PerfectTime");

for(int i = 0; i < 10; i++) System.out.println("Perfect time = " + t.getPerfectTime()); } catch(Exception e) { e.printStackTrace(); } }}

Java Networking

Transparency No. 1-79

Problem 4

Use Socket to implement a simple file transfer client/server

1. server-side : SftpServer1. has a userdata.cfg file, each line of which records a user information i

ncluding: 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

Java Networking

Transparency No. 1-80

pubic class SftpClient { // constructor public SftpClient(String ip, String port, String user, String pass

w) get(String remoteFilePathName, String localFileName) throws IO

Exception, remoteFileNotFound; put(String remoteFilePathName, String localFileName) throws I

OException, RemoteFileNotWritable; pubic static void main(String[] args ) { }

Java Networking

Transparency No. 1-81

usage of SftpClient

java SftpClient Option* {get | put } remotefileName [localName] Where Option is any of

-server ip:port -user username:passwd -terminate

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:

Java Networking

Transparency No. 1-82

Problem4Test.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