Title: Lecture 8. Java Distributed Computing
1Lecture 8. Java Distributed Computing
2Distributed Computing
- Network programming
- JDBC
- Servlets JSPs
- Remote Method Invocation (RMI)
- Others not covered
- CORBA
- Enterprise JavaBeans (EJB)
- JINI
- JavaSpaces
3Network 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.htm
l - Thinking in java, ch 15 http//www.eckelobjects.co
m/TIJ2/index.html. - Java Network Programming by Elliotte Rusty
Harold, OReilly Books, 2nd Edition 2000. visit
http//www.ibooks.com for a free online reference.
4Networking Basics
5TCP 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.
6Identifying 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
7Servers 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
8Testing 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(nul
l) - Equivalently
- InetAddress.getByName("localhost")
- Or using the reserved IP number for the loopback
- InetAddress.getByName("127.0.0.1")
9WhoAmI
- // 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(args0
) - System.out.println(a)
-
10Port Unique Place in a Machine
- IP address isnt 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
11Sockets
- 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 isnt 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
12Just 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, its like reading and writing any
other IO stream!
13Simple 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)
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())),true)
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()
-
16The 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 neednt 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
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 lt 10 i )
- out.println(sending " i)
String str in.readLine() - System.out.println(str)
-
- out.println("END")
- finally System.out.println("closing...
") socket.close() -
18Serving 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. -
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) -
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()
-
21JabberClientThread
- // 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. -
-
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.
-
-
23- public void run()
- try
- for(int i 0 i lt 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
-
24MultiJabberClient
- 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() lt
MAX_THREADS) - new JabberClientThread(addr)
- Thread.currentThread().sleep(100) //
Why not just sleep(100)? -
25Port Warning
- Problem program works fine, except when client
is behind a firewall - Firewall doesnt like to see anything but
ordinary network connections to WWW server via
its standard http port 80 - Servlets solve the problem
26User 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
wont always get there - c.f.
- TCP ? Telephone system
- UDP ? postal service
27Datagrams
- 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 didnt, 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
28DatagramPacket
- 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 )
29DatagramPacket 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 )
30DatagramSocket
- 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 gt allocated by machine
- DatagramSocket( int port ,InetAddress laddr
- DatagramSocket(SocketAddress bindaddr )
- Methods
- // for local info manipulation
- void bind(SocketAddress),
- isBound(),
- getLocalAddress(), getLocalPort(),
getLocalSocketAddress()
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(), getRemoteSocketAddres
s() - //send/receive data
- send(DatagramPacket)
- receive(DatagramPacket)
- // others
- isClosed()
- getBroadcast(), setBroadcast(boolean),
- getSoTimeout(), setSoTimeout(int),
32Example UDP programming The client side program
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
)
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
()
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 )
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.getAddres
s() "\nHost port "
receivePacket.getPort()
"\nLength " receivePacket.getLength()
"\nContaining\n\t" new String(
receivePacket.getData(), 0,
receivePacket.getLength() ) )
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.invokeL
ater( new Runnable() // inner class
to ensure GUI updates properly
public void run() // updates displayArea
displayArea.append( messageToDisplay )
displayArea.setCaretPosition(
displayArea.getText().length() )
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
39The server side program
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 )
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
42 // display information from received
packet displayMessage( "\nPacket
received" "\nFrom host "
receivePacket.getAddress()
"\nHost port " receivePacket.getPort()
"\nLength " receivePacket.getLen
gth() "\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
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.invok
eLater( new Runnable() // inner
class to ensure GUI updates properly
public void run() // updates displayArea
displayArea.append(
messageToDisplay )
displayArea.setCaretPosition( displayArea.getText
().length() )
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
45Access 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.h
tmlloc2 - ftp//java.sun.com/pub/
- http//java.sun.com/servlet/app1?userchenpasswd
- file///D/chencc/java2002/index.html
46Creating a URL
- Direct from URL address
- String j2k http//xml.cs.nccu.edu.tw/Courses/ja
va2000 - 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/Co
urses/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 , URLStreamHandler h) - URL(URL baseURL, String relativeURL
,URLStreamHandler ) - possible exception MalformedURLException
47Parsing 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.
48Example
- import java.net. import java.io.
- public class ParseURL
- public static void main(String args) throws
Exception - URL aURL new URL("http//java.sun.com80
/docs/books/" -
"tutorial/index.htmlDOWNLOADING") - 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
49Reading 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()
50Connecting 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 - . . .
-
51Reading 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()
52Writing 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.
53- String stringToReverse URLEncoder.encode(args0
) - URL url new URL("http//java.sun.com/cgi-bin/ba
ckwards") - URLConnection connection url.openConnection()
- connection.setDoOutput(true)
- PrintWriter out new PrintWriter(
- connection.getOutputStr
eam()) - 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()
54JDBC
- Java DataBase Connectivity
- Allows you to write SQL without worrying about
what brand of database youre connecting to - Provides a simple interface for database
programming
55JDBC database URL
- A string used to identify data source ( and
parameters) - The format
- jdbc ltsubprotocolgt ltotherStuffgt
- jdbc means using JDBC
- ltsubprotocolgt the name of the driver or the name
of a database connectivity mechanism. - ltotherStuffgt 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 "jdbcodbc//whitehouse.gov50
00/CATSPWDHillary"
56- // c15Lookup.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 "jdbcodbcpeople"
- String user "" String password ""
- try // Load the driver (registers
itself) - Class.forName( "sun.jdbc.odbc.JdbcOdbcDriv
er") Connection c DriverManager.getConnectio
n - ( dbUrl, user, password)
- Statement s
c.createStatement()
57- // SQL code
- ResultSet r s.executeQuery(
- "SELECT FIRST, LAST, EMAIL FROM people.csv
people " - "WHERE (LAST'" args0 "') " " 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()
-
58Servlets
- Servlets are to servers what applets are to
browsers - Servlet API (a standard Java extension) is truly
cross-platform - 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
59Running 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
60Works 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("ltHEADgtltTITLEgt")
- out.print("A server-side strategy")
- out.print("lt/TITLEgtlt/HEADgtltBODYgt")
- out.print("lth1gtServlets Rule! " i)
- out.print("lt/h1gtlt/BODYgt")
- out.close()
61Easy 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("lth1gtYour form containedlt/h1gt")
- Enumeration flds req.getParameterNames()
- while(flds.hasMoreElements()) String field
(String)flds.nextElement() - String value req.getParameter(field)
- out.print(field " " value "ltbrgt")
-
- out.close()
62- public void doPost(HttpServletRequest req,
HttpServletResponse res) throws IOException - doGet(req, res)
-
63One 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("lth1gtFinished " i "lt/h1gt")
- out.close()
64Java 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.
65Java 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
66Most code is built for you
- lthtmlgtltbodygt ltH1gtThe time in seconds is
- lt System.currentTimeMillis()/1000 gt
- lt/H1gt lt/bodygtlt/htmlgt
- Plenty of Java code is produced, HTML
- The lt coerces the resulting expression to a
String - Code automatically rebuilt recompiled when JSP
source file changes
67Basic JSP operations
- lt-- This JSP comment will not appear in the
generated html --gt - lt-- This is a JSP directive --gt
- lt_at_ page import"java.util." gt
- lt-- These are declarations --gt
- lt!
- long loadTime System.currentTimeMillis()
- Date loadDate new Date()
- int hitCount 0
- gt
- lthtmlgtltbodygt
- lt-- The next several lines are the result of a
JSP expression inserted in the generated html
the '' indicates a JSP expression --gt - ltH1gtThis page was loaded at lt loadDate gt lt/H1gt
68- ltH1gtHello, world! It's lt new Date() gtlt/H1gt
- ltH2gtHere's an object lt new Object() gtlt/H2gt
- ltH2gtThis page has been up lt (System.currentTimeM
illis()-loadTime)/1000 gt secondslt/H2gt - ltH3gtPage has been accessed lt hitCount gt
times since lt loadDate gtlt/H3gt - lt-- A "scriptlet" which writes to the server
console. Note that a '' is required --gt - lt System.out.println("Goodbye")
out.println("Cheerio") gt - lt/bodygtlt/htmlgt
69Extracting fields and values
- You can mix Java code HTML
- An if statement can print HTML in its body
- lt-- Fetching the data from an HTML form --gt
- lt-- Also generates the form --gt
- lt_at_ page import"java.util." gt
- lthtmlgtltbodygt ltH1gtDisplayFormDatalt/H1gtltH3gt
- lt Enumeration f request.getParameterNames()
- if(!f.hasMoreElements()) // No fields
gt - ltform method"POST" action"DisplayFormData.jsp"gt
- lt for(int i 0 i lt 10 i) gt
- Fieldltigt ltinput type"text" size"20"
name"Fieldltigt" value"Valueltigt"gtltbrgt lt
gt
70- ltINPUT TYPEsubmit namesubmit Value"Submit"gt
lt/formgt - lt gt
- lt
- Enumeration flds request.getParameterNames()
- while(flds.hasMoreElements())
- String field (String)flds.nextElement()
- String value request.getParameter(field)
- gt
- ltligt lt field gt lt value gt lt/ligt
- lt gt
- lt/H3gtlt/bodygtlt/htmlgt
71Remote 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
721) Make a Remote Interface
- // Thinking in Java, ch15rmi
PerfectTimeIF.java - // The PerfectTime remote interface.
- package c15.rmi
- import java.rmi.
- interface PerfectTimeIF extends Remote
- long getPerfectTime() throws RemoteException
-
732) 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
74- // c15rmiPerfectTime.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
75- // Registration for RMI serving
- public static void main(String args)
- System.setSecurityManager( new
RMISecurityManager()) - try
- PerfectTime pt new PerfectTime()
Naming.bind( "//peppy2005/PerfectTime", pt)
System.out.println("Ready to do time") - catch(Exception e) e.printStackTrace()
-
76Starting The Registry
- At default port 1099
- start rmiregistry (Win95)
- rmiregistry (Unix)
- At specified port
- start rmiregistry 2005 (Win95)
- rmiregistry 2005 (Unix)
77Creating 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
783) Use the Remote Object
- // c15rmiDisplayPerfectTime.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 - ( "//peppy2005/PerfectTime")
- for(int i 0 i lt 10 i)
- System.out.println("Perfect time "
t.getPerfectTime()) - catch(Exception e) e.printStackTrace()
79Problem 4
- Use Socket to implement a simple file transfer
client/server - server-side SftpServer
- has a userdata.cfg file, each line of which
records a user information including user-name,
pass-word and users home directory - Each user can get/put files on his home directory
(and subdirectory) - there is a global uploading directory ( say
incoming ) to which every user can put files - there is a global directory ( say pub) from which
every user can get files. - to handle simultaneous request of multi users,
your server must be multithreaded. - Client-side SftpClient
80- 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 )
81usage of SftpClient
- java SftpClient Option get put
remotefileName localName - Where Option is any of
- -server ipport -user usernamepasswd
- -terminate
- Exs
- gt java SftpClient server 140.119.162.2302021
user chencc123456 - get pub/java2000.html
D/temp/java2000.html - gt java SftpClient server xml.cs.nccu.edu.tw2021
user test1111 - put incoming/test1.txt
test1.txt - Run the batch to test your client
82Problem4Test.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 localhost2021 user
test1111 get pub/test1.txt c\temp\test1.txt - Rem put the file c\temp\test2.txt to server
- java SftpClient server 127.0.0.12021 user
test1111 put incoming/test2.txt
c\temp\test2.txt - Rem terminate the server
- java SftpClient server 127.0.0.12021 user
root1111 -terminate