260 likes | 411 Views
COMP201 Java Programming Part III: Advanced Features. Topic 14: Networking Volume II,Chapter 3. Outline. Networking basics IP addresses, ports, protocols, client-server interaction Socket-level programming Writing a client Writing a server URL connections and web servers
E N D
COMP201 Java Programming Part III: Advanced Features Topic 14: Networking Volume II,Chapter 3
Outline • Networking basics • IP addresses, ports, protocols, client-server interaction • Socket-level programming • Writing a client • Writing a server • URL connections and web servers • Retrieving information • Sending information
Networking Basics • Internet protocol (IP) address • Every host on Internet has a unique IP address 143.89.40.46, 203.184.197.198 203.184.197.196, 203.184.197.197, 127.0.0.1 • More convenient to refer to using hostname string cs.ust.hk, tom.com, localhost • Domain Naming Service (DNS) maps names to numbers • One hostname can correspond to multiple internet addresses: tom.com: 203.184.197.196, 203.184.197.196, 203.184.197.197 (down to one now)
Networking Basics • java.net.InetAddress class converts between hostnames and internet addresses InetAddress tm = InetAddress.getByName(“tom.com"); InetAddress tm= InetAddress.getByName(“localhost"); //127.0.0.1 InetAddress tm = InetAddress.getLocalHost(); • Can get array of addresses (if more than one) InetAddress[] addrs; addrs=InetAddress.getAllByName(“tom.com"); for (int i = 0; i < addr.length; i++) System.out.println(addrs[i].getHostAddress()); InetAddressTest.java
Networking Basics • Ports • A port identifies a service within a host Many different services can be running on the host • Many standard port numbers are pre-assigned time of day 13, ftp 21, telnet 23, smtp 25, finger 79, http 80 see /etc/services on workstation for list of all assigned ports • IP address + port number = "phone number“ for service
Networking Basics • protocols : rules that facilitate communications between machines Time of day just reports time, ftp has put/get commands, etc. • Protocols must be standardized and documented So machines can reliably work with one another • TCP (Transmission Control Protocol) vs UDP (User Datagram Protocol, good for, e.g., video delivery)
Networking Basics • Client-Server interaction • Communication between hosts is two-way, but usually the two hosts take different roles • Server waits for client to make request Server registered on a known port with the host ("public phone number") Usually running in endless loop Listens for incoming client connections
Networking Basics • Client "calls" server to start a conversation Client making calls uses hostname/IP address and port number Sends request and waits for response • Standard services always running ftp, http, smtp, etc. server running on host using expected port • Server offers shared resource (information,database, files, printer, compute power) to clients
Networking Basics • Using telnetto try out some services of servers: • Telnet assumes you want to connect to port 23 on the receiving host (port 23 is where the telnet server is listening) • However there is an optional argument after the hostname that allows you to connect to a different port • Try the following Get time: telnet time-A.timefreq.bldrdoc.gov 13 Finger some one: telnet cssu100.cs.ust.hk 79 & type a username Get HTML page: telnet tom.com 80 and enter a GET command
Socket-Level Programming A socketis a bi-directional communication channel between hosts Send and receive data using streams OutputStream InputStream Client Server InputStream OutputStream • Next: • How to write a client • How to write a server
Socket-Level Programming/Client • To write a client • Create a new Socket with hostname and port number of the connection Socket s = New Socket(StringhostName,intportNumber); • Call s.getOutputStream() and s.getInputStream() to get streams for sending and receiving infomation • Need to learn protocol used to communicate • Know how to properly form requests to send to server • Know how to interpret the server’s responses
Socket-Level Programming/Client • Example: A client using http to request page Socket s = new Socket(“tom.com", 80); PrintWriter send = new PrintWriter(s.getOutputStream()); send.print("GET\n"); send.flush(); BufferedReader recv = new BufferedReader( new InputStreamReader(s.getInputStream())); String line; while ((line = recv.readLine()) != null) System.out.println(line); s.close()//HttpTest.java. This is basically what web browsers do.
Socket-Level Programming/Client Use setSoTimeoutmethod to limit the amount of time waiting for data Socket s = new Socket(“tom.com", 80); s.setSoTimeout( 10000 ); // time out after 10 seconds Can still wait indefinitely for initial connection (construction of socket object).
Socket-Level Programming/Client Solution: Construct socket in a separate thread and use the join method to time out. class SocketOpener implements Runnable { public SocketOpener(String aHost, int aPort) { socket = null; host = aHost; port = aPort; } publicvoid run() { try { socket = new Socket(host, port);} catch (IOException exception) {} } public Socket getSocket() { return socket; } … private String host; private int port; private Socket socket;
Socket-Level Programming/Client class SocketOpener implements Runnable { // method to be called by main thread public static Socket openSocket(String aHost, int aPort, int timeout) { SocketOpener opener = new SocketOpener(aHost, aPort); Thread t = new Thread(opener); t.start(); try { t.join(timeout); // wait at most timeout milliseconds } // for the thread to dead catch (InterruptedException exception){} return opener.getSocket(); } SocketOpenerTest.java
Socket-Level Programming/Server • To write a server • Create a new ServerSocket with a port number to listen on the port ServerSocket s = New ServerSocket( portNumber); • Useaccept() to listen on the port. • accept() returns a socket incoming when a client calls Socket incoming = s.accept(); • Call incoming.getOutputStream() and incoming.getInputStream() to get streams for sending and receiving information
Socket-Level Programming/Server Example: Echo server ServerSocket s = new ServerSocket(8189); while (true) { Socket incoming = s.accept( ); BufferedReader in = new BufferedReader (new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter (incoming.getOutputStream(), true/* autoFlush */ ); out.println( "Hello! Enter BYE to exit." ); … } EchoServer.java
Socket-Level Programming/Server Multithread server: starts a separate thread for each connection. public class ThreadedEchoServer { public static void main(String[] args ) { int i = 1; try{ServerSocket s = newServerSocket(8190); while (true) { Socket incoming = s.accept( ); System.out.println("Spawning " + i); new ThreadedEchoHandler(incoming, i).start(); i++; } } catch (Exception e) …. //ThreadedEchoServer.java
Socket-Level Programming/Server class ThreadedEchoHandler extends Thread { publicThreadedEchoHandler(Socket i, int c) { incoming = i; counter = c; } public void run() { try { BufferedReader in = new BufferedReader (new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter (incoming.getOutputStream(),true /* autoFlush */); out.println( "Hello! Enter BYE to exit." ); … private Socket incoming; private int counter; }
Socket-Level Programming/Server • ICQServer.java • A simple server that listens on port 7777. • Connect two clients so that they can talk to each other. • Can handle more than one pairs. • See code for details.
URL Connections • URL stands for Uniform Resource Locator Neat scheme for uniquely identifying all kinds of network resources • Basic form <protocol>:<sitename><pathname> http://www.cs.ust.hk/~liao/comp201/index.html ftp://ftp.cs.ust.hk/pub/lzhang/teach/201/codes/HttpTest/HttpTest.java file:/MyDisk/Letters/ToMom2-11-98 Protocols include files, http, ftp, gopher, news, mailto, etc. • Connecting to a URL, the hard way Manually parse out the host, protocol, path from URL Create a socket to host Use protocol to send the right request & interpret response But Java makes this much easier than that...
URL Connections/Retrieve Info • Open connection with java.net.URLURL url1 = new URL(“http://www.cs.ust.hk/~liao/comp201/index.html”); URL url2 = new URL (“ftp://ftp.cs.ust.hk/pub/lzhang/teach/201/codes/net/HttpTest/HttpTest.java”); • To fetch contents of resource, use openStream method of URL, which returns a InputStream InputStream in1 = url1.openStream(); InputStream in2 = url2.openStream(); Now we can nest the InputStreams with other Java streams to retrieve contents • Advantages • No need to worry about protocol details & port. • Connection to particular file, not easy to do at Socket level
URL Connections/Retrieve Info • Use java.net.URLConnectionfor additional info about resource • Create URLConnectionobject from URL, URLConnection cnn = url.openConnection(); • Set properties of connections: E.g. setDoOutPut(true) for sending information to the server • Make connection: cnn.connect(); • Query header information: getContentType, getContentLength, getContentEncoding, getDate, getExpiration, getLastModified • getInputStream for reading and getOutputStream for writing URLConnectionTest.java
URL Connections/Sending Info • Web servers receive information from clients using either GET or POST • http://maps.yahoo.com/py/maps.py: <form action="/py/maps.py?Pyt=Tmap&YY=28457" method=GET> … </form> • http://www.census.gov/ipc/www/idbprint.html: <form method=postaction="/cgi-bin/ipc/idbsprd"> • Appropriate CGI (common gateway interface) script is called to process info received and produce an HTML page to send back to client • CGI scripts usually written in C, Perl, shell script. (Out of the scope of this course.) • Will discuss servlets, Java alternative to CGI scripts
URL Connections/Sending Info • Send information to server using GET • Attach parameters to the end of URL http://host/script?parameters • Separate parameters using “&” and encode parameters as follows to avoid misinterpretation (URL encoding) • Static String encode (String s) • Replace space with “+” • Replace each non-alphanumeric character with “%” followed by the hexadecimal code of the character “Mastering C++” “Mastering+C%2b%2b” • Disadvantage: long parameter string, might exceed limits of browsers. GetTest.java
URL Connections/Sending Info • Sending information to server using POST: Open URLConnection and send parameter using a stream • Open a URLConnection: URL url = new URL(“http:/host/script”); URLConnection cnn = url.openConnection(); • Set up connection for output: cnn.setDoOutput(true); • Get a stream for sending data: PrinterWriter out = new PrintWriter(cnn.getOutputStream()); • Send parameters Out.print(name1 + “=“ + URLEncoder.encode(value1) + “&” ); Out.print(name2 + “=“ + URLEncoder.encode(value2) + “\n”); PostTest.java