client server distributed systems l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Client/Server Distributed Systems PowerPoint Presentation
Download Presentation
Client/Server Distributed Systems

Loading in 2 Seconds...

play fullscreen
1 / 125

Client/Server Distributed Systems - PowerPoint PPT Presentation


  • 316 Views
  • Uploaded on

Client/Server Distributed Systems. 240-322, Semester 1, 2005-2006. Objectives describe basic networking in Java Web page retrieval and sockets programming. 11. Java Networking. Contents. 1. Networking Restrictions in Java 2. Basic Networking Classes 3. Sockets (Java Style)

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Client/Server Distributed Systems' - Ava


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
client server distributed systems
Client/Server Distributed Systems

240-322, Semester 1, 2005-2006

  • Objectives
    • describe basic networking in Java
    • Web page retrieval and sockets programming

11. Java Networking

contents
Contents

1. Networking Restrictions in Java

2. Basic Networking Classes

3. Sockets (Java Style)

4. Retrieving a Web Page

  • 4 different approaches

5. A Stream Socket Client/Server

continued

slide3
6. A Datagram Socket Client/Server

7. Networked Tic-Tac-Toe

8. More Information

1 networking restrictions in java
1. Networking Restrictions in Java
  • Many browsers place networking restrictions on applets
    • usually communication is limited to being between your machine and the one where the applet came from
  • There are no restrictions on Java applications or when using appletviewer
relaxing security
Relaxing Security
  • Applets can be signed with trusted certificates
    • a browser can be configured to relax security depending on an applet’s signature
    • an advanced topic
2 basic networking classes
2. Basic Networking Classes
  • The J2SE documentation for java.net lists over 30 classes. A few of the key ones:
  • InetAddress
    • the class that represents IP addresses and contains operations for manipulating them
      • see section 2.1

continued

slide7
URL
    • used to retrieve the Web page at the given URL
  • URLConnection
    • also used to retrieve a Web page
    • allows extra parameters to be sent to the URL
      • e.g HTTP request headers

continued

slide8
Socket
    • the client-side socket class for TCP
  • ServerSocket
    • the server-side socket class for TCP
  • DatagramSocket
    • allows a client or server to send/receive UDP packets
2 1 finding an ip address
2.1. Finding an IP Address
  • Java’s InetAddress class makes the mapping between hostnames and IP addresses much easier than in UNIX.
  • For details, look at the the documentation for java.net.InetAddress
whatip java
WhatIP.java

import java.io.*;import java.net.*;public class WhatIP {public static void main(String args[]) throws IOException { InetAddress addr = InetAddress.getByName(args[0]);System.out.println("Inet address is "+ addr);} }

slide11
Use

Carried out from a DOS

prompt on my Windows machine.

3 sockets java style
3. Sockets (Java Style)
  • 1. Stream Sockets
    • the client/server connection exists for the entire duration of the request and answer
      • similar to a telephone call
    • a connection-oriented service
      • corresponds to TCP
    • Java has separate classes for client and server stream sockets (see section 5)
slide13
2. Datagram Sockets
    • the client/server send messages (packets, datagrams) to each other
      • similar to the postal service
    • a connectionless service
      • corresponds to UDP
    • Java has classes for datagram sockets and packets (see section 6).
3 1 pinging
3.1. Pinging

ping is a DOS command, not Java.

  • ping uses the ICMP protocol's ECHO_REQUEST datagram. The host’s answer is an ICMP ECHO_RESPONSE.
slide15
ICMP packets can only be created via a socket of type SOCK_RAW.
    • but Java only supports SOCK_STREAM (TCP) and SOCK_DGRAM (UDP) sockets
  • Our solution: use a TCP connection to the daytime service to pretend to ping
    • the daytime server listens at port 13
3 2 dayping java j j 2 p 677
3.2. DayPing.java JJ2, p.677

import java.io.*;import java.net.*;public class DayPing { public static void main(String args[]) throws Exception{if (args.length != 1) {System.out.println( "Usage: java DayPing <machine name>");System.exit(0); } :

slide17
String machine = args[0];Socket so = new Socket(machine, 13); // daytime server listens at port 13BufferedReader br =new BufferedReader( new InputStreamReader( so.getInputStream() ) ); System.out.println( machine + " is alive at " + br.readLine());so.close(); } // end of main()} // end of DayPing class
notes
Notes
  • DayPing.java converts the socket connection into a BufferedReader
    • this allows readLine() to be used for socket input
  • Using layered streams to add I/O functionality on top of sockets is a powerful feature of Java.
slide19
Use

All the examples were tested on

my Windows machine

  • C> javac DayPing.java
  • C> java DayPing calvincalvin is alive at Sat May 7 13:46:06 2005
  • C> java DayPing fourdotsException in thread "main" java.net.ConnectException: Connection refused: no further information at java.net.PlainSocketImpl.socketConnect (Native Method) at java.net.PlainSocketImpl.doConnect... : at ping.main(DayPing.java:23)

continued

slide20

After a wait

  • C> java DayPing takasillaException in thread "main" java.net.UnknownHostException: takasilla at java.net.PlainSocketImpl. connect(Unknown Source) : at ping.main(DayPing.java:23)
  • C> java DayPing www.amazon.comException in thread "main" java.net.NoRouteToHostException: Operation timed out: connect at java.net.PlainSocketImpl. socketConnect(Native Method) : at ping.main(DayPing.java:23)

After a long wait

3 3 why doesn t dayping work
3.3. Why Doesn't DayPing Work?
  • The examples that don't work show three different errors:
    • ConnectException
    • UnknownHostException
    • NoRouteToHostException
  • The "unknown host" exception is caused by an incorrect IP address.

continued

slide22
The "connection" exception probably means that the server is unavailable (switched off)
    • this can be confirmed for a TCP service by trying to connect to it with telnet:

$ telnet fourdots 13Trying 172.30.255.4...telnet: Unable to connect to remote host: Connection refused$

executed from a different

machine (fivedots)

continued

slide23
The "no route to host" exception usually means that there is a firewall preventing the connection from being made.
  • telnet response:

$ telnet www.amazon.com 13Trying 207.171.163.90...telnet: Unable to connect to remote host: Connection timed out$

A long wait,

and then...

tried on (fivedots)

3 4 firewalls at psu
3.4. Firewalls at PSU

(simplified)

University

ratree

Departmental firewall

(no external socket creation; URLs allowed)

The Internet

Univ. firewall

(no external socket creation;

URLs only throughthe ‘cache’ proxy)

calvin

takasila

fivedots

cache

8080

CoE Department

slide25
Ordinary users (i.e. students) cannot write socket-based programs that communicate outside PSU
    • this is true in any language (Java, C, etc.)
  • But programs can retrieve Web pages (and other things) using the Java URL class
    • the URL request must go through PSU's cache machine
urls and sockets
URLs and Sockets
  • From your data communications course, you may recall that the Web protocol, HTTP, is built on top of TCP/IP.
  • Java's URL class uses stream sockets (TCP/IP) for its implementation
    • so why does it get past cache?

continued

slide27
cache accepts socket links to valid Web servers, but also checks that the HTTP GET (or POST) message includes additional valid HTTP headers.
    • all of this HTTP stuff is carried out by the URL class for us
4 retrieving a web page
4. Retrieving a Web Page
  • Five ways of obtaining a Web page:
    • 1. use a socket, and send a GET message to the server
      • see GetSocketPage.java
    • 2. use a URL object, and read the page via a stream
      • see GetURLPage.java

continued

slide29
3. use a URL object, and display the page in a browser
    • see showPage.java
  • 4. display a URL in an JEditorPane
    • see ShowURLPage.java
  • 5. use a HTTP URL connection, and send a GET message
    • see Java’s networking tutorial
4 1 sockets and get
4.1. Sockets and GET
  • GetSocketPage.java retrieves the page:

http://<host name>/index.html

e.g.http://fivedots.coe.psu.ac.th/index.html

  • It prints the text of the page to stdout.

continued

slide31
It opens a socket at port 80 for the host, which is the usually place where the Web server is listening.
  • It sends the HTTP GET message:

GET /index.html

diagram
Diagram

GET /index.html

80

Web

server

Web page

(as text)

GetSocketPage

client

host

getsocketpage java
GetSocketPage.java

import java.io.*;import java.net.*;public class GetSocketPage

{public static void main(String args[]) throws IOException {Socket sock = new Socket(args[0],80); :

slide34
BufferedReader dis = new BufferedReader( new InputStreamReader( sock.getInputStream() ));PrintStream ps = new PrintStream( sock.getOutputStream() );ps.println("GET /index.html");String line;while ((line = dis.readLine()) != null)System.out.println(line);sock.close();}} // end of GetSocketPage.java
notes35
Notes
  • GetSocketPage.java converts the socket connection into a BufferedReader for input, and a PrintStream for output
    • uses readLine()for socket input
    • uses println() for socket output
slide36
Use

C> javac GetSocketPage.java

C> java GetSocketPage fivedots<html><head><title>Un title page</title></head><meta http-equiv="Content-Type" content="text/html; charset=windows-874"><style type="text/css"> :C>

text of Web page

printed to stdout

slide37
But...

C> java GetSocketPage www.amazon.comException in thread "main" java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl. socketConnect(Native Method) :at GetSocketPage.main(GetSocketPage.java:18)

The firewall around PSU

prevents Web server

access by sockets.

continued

slide38
cache rejected the GET message to the external site since the message didn't include additional HTTP headers.
  • These can be supplied by us, but it's easier to use the URL class.
4 2 url object
4.2. URL Object
  • GetURLPage.java avoids the firewall problem with sockets by using a URL object.
  • A URL object allows a Web page to be retrieved as a stream of text
    • our program prints the text to stdout.
geturlpage java
GetURLPage.java

import java.net.*;import java.io.*;public class GetURLPage {public static void main(String args[]) {try {URL url = new URL(args[0]);BufferedReader dis = new BufferedReader(new InputStreamReader( url.openStream() )); :

slide41
String line;while ( (line=dis.readLine())!=null )System.out.println(line);dis.close();} catch (Exception e) { System.out.println(e); } }} // end of GetURLPage.java
notes42
Notes
  • A stream for the URL object is obtained using openStream()
    • after that the same input stream layering technique is used as in GetSocketPage.java
    • there is no need to send a GET message
slide43
Use

after a

long wait

  • C> javac GetURLPage.java
  • C> java GetURLPage http://www.amazon.co.ukjava.net.ConnectException: Connection timed out: connect
  • C> java -DproxySet=true -DproxyHost=cache.psu.ac.th -DproxyPort=8080 GetURLPage http://www.amazon.com/<html><head><title>Amazon Page</title></head><body bgcolor=#ffffff test=#000000><H1> :C>

typed on

one line

slide44
Ordinary users can access outside PSU by using URLs, but they must route their requests via PSU cache machine.
batch files for long commands
Batch Files for Long Commands
  • GetURLPage.bat contains:

@echo offecho Executing GetURLPage...java -DproxySet=true -DproxyHost=cache.psu.ac.th -DproxyPort=8080 GetURLPage %1

  • Use:

c> GetURLPage http://www.amazon.co.uk : // same output as last slide

proxy username password
Proxy Username/Password
  • A further level of firewall security is to require the user to enter a username and password
    • called proxy authorization
  • Java has network support for authorization
    • it allows a username and password to be sent by a client program to the firewall

continued

slide47
A good tutorial:
    • “Jump a Proxy/Firewall and Live to Tell About it”http://www.devx.com/upload/free/features/javapro/2000/03mar00/te0003/te0003.asp
  • Slightly modified code is in GetThroughProxy.javaat:

http://fivedots.coe.psu.ac.th/ Software.coe/Cliserv/ Code%20Examples/Java%20Code/ Basic%20Networking/

4 3 passing a url to a browser
4.3. Passing a URL to a Browser
  • If the Java code is in an applet, then the downloaded URL can be displayed in the browser.
  • showPage.html displays a user-specified Web page in the (Opera) browser, using the ShowPage.java applet.
usage
Usage

The dialog box appears in front

of the browser window.

continued

slide50

Loaded

Page:

showpage html
showPage.html

<html><head><title>Web Page Loading Applet</title></head><body><h1>Web Page Loading Applet</h1><P>Applet is placed here... <applet code="ShowPage.class" width=300 height=50></applet></P></body></html>

showpage java
showPage.java

import java.net.*;import javax.swing.*;import java.applet.AppletContext;import javax.swing.JOptionPane;public class ShowPage extends JApplet { public void init() { try { String urlString = JOptionPane.showInputDialog( "Enter a URL:");URL url = new URL(urlString); :

slide53
AppletContext browser = getAppletContext(); browser.showDocument(url); } catch (Exception e) { System.out.println(e); } } // end of init()} // end of ShowPage
notes54
Notes
  • The download only works because the browser is set up to work through cache.
  • There are no Java security restrictions on a applet passing a URL to a browser to be displayed.

continued

slide55
A URL is downloaded with showDocument(), which must be called in the applet’s environment (i.e. the browser):
    • AppletContext browser = getAppletContext();browser.showDocument(url);
  • The URL is automatically loaded into the browser, replacing showPage.html.

continued

slide56
There is a two-argument version of showDocument() that can load URLs into frames.
  • D&D contains a more complex example (SiteSelector.java, ch. 21) which allows the user to select a URL from a list.
4 4 displaying a url with jeditorpane
4.4. Displaying a URL with JEditorPane
  • The Swing GUI includes JEditorPane which allows 'structured' text to be displayed and edited.
    • offers basic support for plain text, RTF, and HTML
    • see javax.swing.JEditorPane

continued

slide58
A JEditorPane can be filled by calling setPage() with a URL string argument.
  • JEditorPane also has support for capturing hyperlink clicks as events.

continued

slide59
With these features, it is possible to write a basic Web browser!
  • ShowURLPage.java has a text field for the user to enter a URL
    • the resulting downloaded page is displayed in a JEditorPane
    • if a link is clicked inside the pane, then its page will be loaded automatically

continued

showurlpage s event model

X

ShowURLPage’s Event Model

GUI

actionevents

enter

^

contents

hyperlink

events

^

hyperlinkUpdate() {...}

Code

actionPerformed() {...}

showurlpage java
ShowURLPage.java

import java.awt.*;import java.awt.event.*;import java.net.*;import java.io.*;import javax.swing.*;import javax.swing.event.*;public class ShowURLPage extends JFrame { private JTextField enter; private JEditorPane contents; :

slide63
public ShowURLPage() { super("Simple Web Browser"); Container c = getContentPane(); enter = new JTextField("Enter file URL here"); enter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e ) { getPage(e.getActionCommand());} }); c.add(enter, BorderLayout.NORTH); :
slide64
contents = new JEditorPane(); contents.setEditable(false); contents.addHyperlinkListener( new HyperlinkListener() { public void hyperlinkUpdate( HyperlinkEvent e) { if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)getPage(e.getURL().toString()); } }); :
slide65
c.add( new JScrollPane(contents), BorderLayout.CENTER); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } // end of ShowURLPage()
slide66
private void getPage(String location) { setCursor(Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR)); try {contents.setPage(location); enter.setText(location); } catch (IOException io) { JOptionPane.showMessageDialog(this, "Error retrieving specified URL", "Bad URL", JOptionPane.ERROR_MESSAGE); } setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR) ); } // end of getPage()
slide67
public static void main(String args[]) { new ShowURLPage(); }} // end of ShowURLPage class
slide68
Use

C> javac ShowURLPage.java

C> java ShowURLPage// A request for http://www.cs.ait.ac.th/~ad// causes a “Bad URL” dialog box to appear

C> java -DproxySet=true -DproxyHost=cache.psu.ac.th -DproxyPort=8080 ShowURLPage

Typed all on one line.

The window shown on the left of slide 60 appears.

notes69
Notes
  • The JEditorPane must be set uneditable so that hyperlinks events can be captured.
  • Hyperlink events include: ENTERED, EXITED, and ACTIVATED.
    • see javax.swing.event.HyperlinkEvent

continued

slide70
getPage() calls setPage() to display a URL in the JEditorPane
    • the call is surrounded by changes to the cursor icon so things look busy
  • getPage() is called in two possible ways:
    • as a response to pressing enter in the textfield
    • as a response to a link being clicked
5 a stream socket client server
5. A Stream Socket Client/Server

AlienClient.java

AlienServer1.java

Initial Internet

connection

4444

socket

Server socket

input andoutputstreams

input andoutput

streams

socketfor clientcomms.

the new socket is made with accept()

slide72
The server creates a new socket when a client contacts it
    • client/server communication via the new socket
    • this frees up the main server socket to receive connections from other clients
    • AlienServer1.java is an iterative server
      • it can only process one client at a time

continued

slide73
Our client and server both run on localhost.
  • AlienServer1 actions:
    • wait for a client connection
    • after a connection, wait for a message from the client
    • respond depending on the content of the message
    • close the client connection, and loop, waiting for another client

continued

diagram for client processing
Diagram for Client Processing

AlienServer1.java

AlienClient.java

1. send message

4. send answer

2. analyse message

3. print message locally

5. close socket

alienserver1 java
AlienServer1.java

import java.io.*;import java.net.*;public class AlienServer1 {public static void main(String args[]) throws IOException {Socket sock; BufferedReader in; PrintStream out;ServerSocket servsock = new ServerSocket(4444); :

slide76
while (true) {// wait for the next client connectionsock = servsock.accept();// Get I/O streams from the socketout = new PrintStream( sock.getOutputStream() );in = new BufferedReader( new InputStreamReader( sock.getInputStream() ) ); :
slide77
// get client message and respondString msg = in.readLine(); System.out.println(" Received: " + msg); if (msg.indexOf("hello") > -1) { System.out.println(" Friendly contact made");out.println("Welcome friend"); } else { System.out.println(" Probably an alien");out.println("ET go home"); }out.flush();// Close this connection, // (not the overall server socket)sock.close();} } // of main()}// end of AlienServer1
the client alienclient java
The client: AlienClient.java
  • AlienClient.java’s actions:
    • open a connection with the server
    • send a message taken from the command line
    • receive and print the server’s response
    • close
alienclient java
AlienClient.java

import java.io.*;import java.net.*;public class AlienClient {public static void main(String args[]) throws IOException {Socket sock = new Socket("localhost", 4444);// Get I/O streams from the socketBufferedReader br = new BufferedReader( new InputStreamReader( sock.getInputStream()) );PrintStream ps = new PrintStream( sock.getOutputStream() ); :

slide80
// Send a message from the command lineps.println(args[0]);ps.flush(); // Read server’s responseString line = br.readLine();System.out.println( "Got this from server:\n " + line);sock.close(); } // end of main() } // end of AlienClient class
slide81
Use

Client:

Server:

I used two separate DOS windows

on the same machine.

a more complex example
A More Complex Example
  • D&D gives a larger stream socket client/server example (ch. 21):
    • object input and output streams are used
    • the sequence of communication is more complex
      • the client maintains a long-lived link with the server until it sends a “TERMINATE” string
5 1 a concurrent server
5.1. A Concurrent Server
  • AlienServer2.java uses threads to handle multiple clients concurrently.
  • Three main advantages:
    • the server code is simpler since server processing is in a separate class called Worker
    • clients do not have to wait
    • the server is more scaleable
alienserver2 visually
AlienServer2 Visually

AlienServer2

AlienClient clients

4444

Workerthreads

each Worker thread can

deal with multiple messages

from its client

5 2 java threads briefly
5.2. Java Threads (Briefly)
  • There are two ways to create a thread:
    • extend the Thread class
    • write a class to implement the Runnable interface
  • We use the first approach since Worker does not need to extend any other classes.

continued

slide87
A class extended from Thread must define the run() method:

class Worker extends Thread { public void run() { ... } }

  • A threaded object is started by calling start():

Worker w = new Worker(...): w.start();

  • The thread will call run() itself from within start().
5 3 alienserver2 java
5.3. AlienServer2.java

import java.io.*;import java.net.*;public class Worker extends Thread{ private Socket sock; private int id; public Worker(Socket s, int c) { sock = s; id = c; } :

slide89
public void run(){// Get I/O streams from the sockettry { PrintStream out = new PrintStream( sock.getOutputStream() ); BufferedReader in = new BufferedReader( new InputStreamReader( sock.getInputStream() )); :
slide90

The worker contains much the same

client processing code as the iterative

server.

// get client messages and respond String msg; while ((msg = in.readLine()) != null) { System.out.println(" Worker "+id+ " received: "+ msg); if (msg.indexOf("hello") > -1) out.println("Welcome friend") elseout.println("ET go home");out.flush(); } :

slide91
// Close this connection, // (not the overall server socket) System.out.println(" Worker " + id + " finished");sock.close();} catch(IOException ioe){System.out.println(ioe); }} // end of run()} // end of Worker class
slide92
public class AlienServer2 {public static void main(String args[]) throws IOException { Socket sock;ServerSocket servsock = new ServerSocket(4444, 6);while (true) {// wait for the next client connectionsock = servsock.accept();new Worker(sock).start();} } // of main()} // of AlienServer2 class
slide93
Use

Server:

6 a datagram socket client server
6. A Datagram Socket Client/Server

UDPClient

UDPServer

packets

any port

5000

Datagramsocket

Datagramsocket

msg

echo

6 1 server event model

X

6.1. Server Event Model

GUI

^

display

^

1) receive fromclient

Code

waitForPackets() {...}

packet

2) echo back to client

packet

6 2 udpserver java
6.2. UDPServer.java

import java.io.*;import java.net.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class UDPServer extends JFrame { private JTextArea display; :

slide99
public UDPServer() { super("UDP Server"); display = new JTextArea(); getContentPane().add( new JScrollPane( display), BorderLayout.CENTER ); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); show();DatagramSocket socket = null; try {socket = new DatagramSocket( 5000 ); } catch(SocketException se) { se.printStackTrace(); System.exit(1); } waitForPackets(socket); } // end of UDPServer()
slide100
private void waitForPackets(DatagramSocket socket) { DatagramPacket sendPacket, receivePacket;while (true) { try {// set up packet data structure byte data[] = new byte[100];receivePacket = new DatagramPacket(data, data.length);// wait for packet from clientsocket.receive(receivePacket); :
slide101
// process client packet display.append("\nPacket received:" + "\nFrom host: "+receivePacket.getAddress()+ "\nHost port: " + receivePacket.getPort() + "\nLength: " + receivePacket.getLength() + "\nContaining:\n\t" + new String(receivePacket.getData(), 0, receivePacket.getLength())); :
slide102
// echo packet info back to client display.append( "\n\nEcho data to client...");sendPacket = new DatagramPacket( receivePacket.getData(), receivePacket.getLength(), receivePacket.getAddress(), receivePacket.getPort() );socket.send( sendPacket ); display.append("Packet sent\n"); display.setCaretPosition( display.getText().length() ); } :
slide103
catch(IOException io) {display.append(io.toString() + "\n"); io.printStackTrace(); } } } // end of waitForPackets{} public static void main( String args[] ) { new UDPServer(); }} // end of UDPServer
server notes
Server Notes
  • The server creates one datagram socket at port 5000:

socket = new DatagramSocket(5000);

  • Datagram socket creation must be inside a try/catch block.

continued

slide105
The server loops inside waitForPackets()
    • creates an empty packet (100 bytes long)
    • blocks inside receive()
  • When receive() returns, the packet contains data and:
    • the Internet address of the sender
    • the port number of the sender
    • the actual length of the data

continued

slide106
The packet information can be accessed via methods. e.g.:

receivePacket.getPort(); receivePacket.getData();

  • receive() must be in a try/catch block.

continued

slide107
The server echoes the datagram back to the client at the address and port obtained from the client’s message:

sendPacket = new DatagramPacket( receivePacket.getData(), receivePacket.getLength(), receivePacket.getAddress(), receivePacket.getPort() ); socket.send(sendPacket);

  • send() must be in a try/catch block.
6 3 client event model

X

6.3. Client Event Model

GUI

actionevents

enter

^

display

^

Code

1) send to server

actionPerformed() {...}

waitForPackets() {...}

packet

2) receive echofrom sender

packet

6 4 udpclient java
6.4. UDPClient.java

import java.io.*;import java.net.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class UDPClient extends JFrame implements ActionListener { private JTextField enter; private JTextArea display; private DatagramSocket socket; :

slide110
public UDPClient() { super("UDP Client"); enter = new JTextField("Type message here"); enter.addActionListener(this); getContentPane().add(enter,BorderLayout.NORTH); display = new JTextArea(); getContentPane().add(new JScrollPane(display), BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); :
slide111
try {socket = new DatagramSocket();}catch(SocketException se) {se.printStackTrace();System.exit(1);} waitForPackets();} // end of UDPClient()
slide112
private void waitForPackets() { DatagramPacket receivePacket; while (true) { try {// set up packet data structure byte data[] = new byte[100];receivePacket = new DatagramPacket(data, data.length);// wait for packet from serversocket.receive(receivePacket); :
slide113
// process packet from serverdisplay.append("\nPacket received:" + "\nFrom host: "+receivePacket.getAddress()+ "\nHost port: " + receivePacket.getPort() + "\nLength: " + receivePacket.getLength() + "\nContaining:\n\t" + new String( receivePacket.getData(), 0, receivePacket.getLength())); display.setCaretPosition( display.getText().length() ); } catch(IOException ex) { display.append(ex.toString()+"\n" ); ex.printStackTrace(); } } } // end of waitForPackets()
slide114
public void actionPerformed(ActionEvent e) {DatagramPacket sendPacket; try { display.append( "\nSending packet containing: " + e.getActionCommand() + "\n" ); String s = e.getActionCommand(); byte data[] = s.getBytes();sendPacket = new DatagramPacket( data, data.length, InetAddress.getLocalHost(), 5000); socket.send(sendPacket); :
slide115
display.append("Packet sent\n"); display.setCaretPosition( display.getText().length() ); } catch (IOException ex) { display.append(ex.toString()+"\n"); ex.printStackTrace(); } } // end of actionPerformed() public static void main( String args[] ) { new UDPClient(); }} // end of UDPClient
client notes
Client Notes
  • The client gets the data for each packet from the user entering a string into a TextField.
  • The client creates a datagram socket with no specified port number:

socket = new DatagramSocket();

continued

slide117
In actionPerformed(), the user’s input is converted into a packet, and sent to the server:

sendPacket = new DatagramPacket( data, data.length(), InetAddress.getLocalHost(), 5000);socket.send(sendPacket);

  • The code assumes that the server is on the same machine as the client, and attached to port 5000.

continued

slide118
The client receives the echoed reply in waitForPackets():
    • the loop blocks inside receive() until a packet arrives from the server
    • the packet details are displayed in the JTextArea
  • The blocked waitForPackets() does not stop the user from entering more strings for the client to send out
    • the GUI always runs in a separate thread
6 5 use

Tested by starting the client and server in

two separate DOS windows.

6.5. Use

1. message sent to server

2. Client message

received and echoed

3. Echoed message

received from the server

continued

7 networked tic tac toe
7. Networked Tic-Tac-Toe

D&D Section 21.8, p.1031

Server

synchronizedvalidMove()

thread

thread

5000

data

data

Client: Player ‘X’

Client: Player ‘O’

thread

thread

8 more information
8. More Information
  • Chapter 21, Deitel & Deitel (D&D)

http://java.coe.psu.ac.th/ForMember/ Books.html#Network

  • Killer Game Programming in JavaChapter 29, Network Basicshttp://fivedots.coe.psu.ac.th/~ad/jg/ch18/
slide124
Core Java 2, Vol II - Advanced FeaturesCay S. Horstmann & Gary CornellSun Microsystems Press, 2001,chapter 3
    • multithreaded server, sending e-mail, URLConnection, HTTP POST
    • http://java.coe.psu.ac.th/ForMember/ Books.html#Network
slide125
Aj. Somchai's Java Site
    • Network and Distributed Programming Books

http://java.coe.psu.ac.th/ForMember/ Books.html#Network