Date post: | 02-Jan-2016 |
Category: |
Documents |
Upload: | kerry-grimes |
View: | 52 times |
Download: | 0 times |
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-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-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