Lecture 8. Java Distributed Computing - PowerPoint PPT Presentation

1 / 82
About This Presentation
Title:

Lecture 8. Java Distributed Computing

Description:

Lecture 8. Java Distributed Computing Cheng-Chia Chen – PowerPoint PPT presentation

Number of Views:157
Avg rating:3.0/5.0
Slides: 83
Provided by: bruce
Category:

less

Transcript and Presenter's Notes

Title: Lecture 8. Java Distributed Computing


1
Lecture 8. Java Distributed Computing
  • Cheng-Chia Chen

2
Distributed Computing
  • Network programming
  • JDBC
  • Servlets JSPs
  • Remote Method Invocation (RMI)
  • Others not covered
  • CORBA
  • Enterprise JavaBeans (EJB)
  • JINI
  • JavaSpaces

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

4
Networking Basics
  • TCP/IP Network Protocol

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.

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

7
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

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(nul
    l)
  • Equivalently
  • InetAddress.getByName("localhost")
  • Or using the reserved IP number for the loopback
  • InetAddress.getByName("127.0.0.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(args0
    )
  • System.out.println(a)

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

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

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, its like reading and writing any
    other IO stream!

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)

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

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

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.

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

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.

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

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() lt
    MAX_THREADS)
  • new JabberClientThread(addr)
  • Thread.currentThread().sleep(100) //
    Why not just sleep(100)?

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

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
    wont always get there
  • c.f.
  • TCP ? Telephone system
  • UDP ? postal service

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

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 )

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 )

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

32
Example 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
39
The 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
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.h
    tmlloc2
  • ftp//java.sun.com/pub/
  • http//java.sun.com/servlet/app1?userchenpasswd
  • file///D/chencc/java2002/index.html

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

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.

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

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

50
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
  • . . .

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

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

54
JDBC
  • 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

55
JDBC 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()

58
Servlets
  • 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

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 application server
  • Execute Tomcat.bat start

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

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

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

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

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

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

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

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

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

72
1) 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

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

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

76
Starting The Registry
  • At default port 1099
  • start rmiregistry (Win95)
  • rmiregistry (Unix)
  • At specified port
  • start rmiregistry 2005 (Win95)
  • rmiregistry 2005 (Unix)

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

78
3) 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()

79
Problem 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 )

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

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 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
Write a Comment
User Comments (0)
About PowerShow.com