Showing posts with label Postedby Abhishek Chitransh.. Show all posts
Showing posts with label Postedby Abhishek Chitransh.. Show all posts

Tuesday, February 17, 2009

What are Sockets and Threads?

What are Sockets and Threads?

A socket is a software endpoint that establishes bidirectional communication between a server program and one or more client programs. The socket associates the server program with a specific hardware port on the machine where it runs so any client program anywhere in the network with a socket associated with that same port can communicate with the server program.

A server program typically provides resources to a network of client programs. Client programs send requests to the server program, and the server program responds to the request.

One way to handle requests from more than one client is to make the server program multi-threaded. A multi-threaded server creates a thread for each communication it accepts from a client. A thread is a sequence of instructions that run independently of the program and of any other threads.

Using threads, a multi-threaded server program can accept a connection from a client, start a thread for that communication, and continue listening for requests from other clients.

About the Examples

The examples for this lesson consist of two versions of the client and server program pair adapted from the FileIO.java application presented in Part 1, Lesson 6: File Access and Permissions.

Example 1 sets up a client and server communication between one server program and one client program. The server program is not multi-threaded and cannot handle requests from more than one client.

Example 2 converts the server program to a multi-threaded version so it can handle requests from more than one client.

Example 1: Client-Side Behavior

The client program presents a simple user interface and prompts for text input. When you click the Click Me button, the text is sent to the server program. The client program expects an echo from the server and prints the echo it receives on its standard output.

Example 1: Server-Side Behavior

The server program presents a simple user interface, and when you click the Click Me button, the text received from the client is displayed. The server echoes the text it receives whether or not you click the Click Me button.

Example 1: Compile and Run

To run the example programs, start the server program first. If you do not, the client program cannot establish the socket connection. Here are the compiler and interpreter commands to compile and run the example.

  javac SocketServer.java
javac SocketClient.java

java SocketServer
java SocketClient

Example 1: Server-Side Program

The server program establishes a socket connection on Port 4321 in its listenSocket method. It reads data sent to it and sends that same data back to the server in its actionPerformed method.

listenSocket Method

The listenSocket method creates a ServerSocket object with the port number on which the server program is going to listen for client communications. The port number must be an available port, which means the number cannot be reserved or already in use. For example, Unix systems reserve ports 1 through 1023 for administrative functions leaving port numbers greater than 1024 available for use.

public void listenSocket(){
try{
server = new ServerSocket(4321);
} catch (IOException e) {
System.out.println("Could not listen on port 4321");
System.exit(-1);
}

Next, the listenSocket method creates a Socket connection for the requesting client. This code executes when a client starts up and requests the connection on the host and port where this server program is running. When the connection is successfully established, the server.accept method returns a new Socket object.
  try{
client = server.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4321");
System.exit(-1);
}

Then, the listenSocket method creates a BufferedReader object to read the data sent over the socket connection from the client program. It also creates a PrintWriter object to send the data received from the client back to the server.
  try{
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(client.getOutputStream(),
true);
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
}

Lastly, the listenSocket method loops on the input stream to read data as it comes in from the client and writes to the output stream to send the data back.
    while(true){
try{
line = in.readLine();
//Send data back to client
out.println(line);
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
}

actionPerformed Method

The actionPerformed method is called by the Java platform for action events such as button clicks. This actionPerformed method uses the text stored in the line object to initialize the textArea object so the retrieved text can be displayed to the end user.

public void actionPerformed(ActionEvent event) {
Object source = event.getSource();

if(source == button){
textArea.setText(line);
}
}

Example 1: Client-Side Program

The client program establishes a connection to the server program on a particular host and port number in its listenSocket method, and sends the data entered by the end user to the server program in its actionPerformed method. The actionPerformed method also receives the data back from the server and prints it to the command line.

listenSocket Method

The listenSocket method first creates a Socket object with the computer name (kq6py) and port number (4321) where the server program is listening for client connection requests. Next, it creates a PrintWriter object to send data over the socket connection to the server program. It also creates a BufferedReader object to read the text sent by the server back to the client.

public void listenSocket(){
//Create socket connection
try{
socket = new Socket("kq6py", 4321);
out = new PrintWriter(socket.getOutputStream(),
true);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
} catch (UnknownHostException e) {
System.out.println("Unknown host: kq6py");
System.exit(1);
} catch (IOException e) {
System.out.println("No I/O");
System.exit(1);
}
}

actionPerformed Method

The actionPerformed method is called by the Java platform for action events such as button clicks. This actionPerformed method code gets the text in the Textfield object and passes it to the PrintWriter object, which then sends it over the socket connection to the server program.

The actionPerformed method then makes the Textfield object blank so it is ready for more end user input. Lastly, it receives the text sent back to it by the server and prints the text out.

public void actionPerformed(ActionEvent event){
Object source = event.getSource();

if(source == button){
//Send data over socket
String text = textField.getText();
out.println(text);
textField.setText(new String(""));
out.println(text);
}
//Receive text from server
try{
String line = in.readLine();
System.out.println("Text received: " + line);
} catch (IOException e){
System.out.println("Read failed");
System.exit(1);
}
}

Example 2: Multithreaded Server Example

The example in its current state works between the server program and one client program only. To allow multiple client connections, the server program has to be converted to a multithreaded server program.

First Client
Second Client
Third Client
The multithreaded server program creates a new thread for every client request. This way each client has its own connection to the server for passing data back and forth. When running multiple threads, you have to be sure that one thread cannot interfere with the data in another thread.

In this example the listenSocket method loops on the server.accept call waiting for client connections and creates an instance of the ClientWorker class for each client connection it accepts. The textArea component that displays the text received from the client connection is passed to the ClientWorker instance with the accepted client connection.

public void listenSocket(){
try{
server = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port 4444");
System.exit(-1);
}
while(true){
ClientWorker w;
try{
//server.accept returns a client connection
w = new ClientWorker(server.accept(), textArea);
Thread t = new Thread(w);
t.start();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
}
}

The important changes in this version of the server program over the non-threaded server program are the line and client variables are no longer instance variables of the server class, but are handled inside the ClientWorker class.

The ClientWorker class implements the Runnable interface, which has one method, run. The run method executes independently in each thread. If three clients request connections, three ClientWorker instances are created, a thread is started for each ClientWorker instance, and the run method executes for each thread.

In this example, the run method creates the input buffer and output writer, loops on the input stream waiting for input from the client, sends the data it receives back to the client, and sets the text in the text area.

class ClientWorker implements Runnable {
private Socket client;
private JTextArea textArea;

//Constructor
ClientWorker(Socket client, JTextArea textArea) {
this.client = client;
this.textArea = textArea;
}

public void run(){
String line;
BufferedReader in = null;
PrintWriter out = null;
try{
in = new BufferedReader(new
InputStreamReader(client.getInputStream()));
out = new
PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
}

while(true){
try{
line = in.readLine();
//Send data back to client
out.println(line);
//Append data to text area
textArea.append(line);
}catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
}
}
}

The JTextArea.append method is thread safe, which means its implementation includes code that allows one thread to finish its append operation before another thread can start an append operation. This prevents one thread from overwriting all or part of a string of appended text and corrupting the output. If the JTextArea.append method were not thread safe, you would need to wrap the call to textArea.append(line) in a synchronized method and replace the run method call to textArea.append(line) with a call to appendText(line):
  public synchronized void appendText(line){
textArea.append(line);
}
The synchronized keyword means this thread has a lock on the textArea and no other thread can change the textArea until this thread finishes its append operation.

The finalize() method is called by the Java virtual machine (JVM)* before the program exits to give the program a chance to clean up and release resources. Multi-threaded programs should close all Files and Sockets they use before exiting so they do not face resource starvation. The call to server.close() in the finalize() method closes the Socket connection used by each thread in this program.

  protected void finalize(){
//Objects created in run method are finalized when
//program terminates and thread exits
try{
server.close();
} catch (IOException e) {
System.out.println("Could not close socket");
System.exit(-1);
}
}

JDK Tools and Utilities.

JDK Development Tools

General Information

The following documents contain important information you will need to know to get the most out of the JDK tools.

JDK File Structure [Solaris] [Linux] [Windows]
Setting the Classpath [Solaris and Linux] [Windows]
How Classes are Found [Solaris, Linux and Windows]

Basic Tools

These tools are the foundation of the JDK. They are the tools you use to create and build applications.
Tool Name Brief Description Links to Reference Pages
javac The compiler for the Java programming language. [Solaris and Linux] [Windows]
java The launcher for Java applications. In this release, a single launcher is used both for development and deployment.
The old deployment launcher, jre, is no longer provided.
[Solaris and Linux] [Windows]
javadoc API documentation generator.
See Javadoc Tool page for doclet and taglet APIs.
[Solaris and Linux] [Windows]
apt Annotation processing tool.
See Annotation Processing Tool for program annotation processing.
[Solaris, Linux, and Windows]
appletviewer Run and debug applets without a web browser. [Solaris and Linux] [Windows]
jar Create and manage Java Archive (JAR) files.
See Java Archive Files page for the JAR specification.
[Solaris and Linux] [Windows]
jdb The Java Debugger.
See JPDA for the debugger architecture specifications.
[Solaris and Linux] [Windows]
javah C header and stub generator. Used to write native methods. [Solaris and Linux] [Windows]
javap Class file disassembler [Solaris and Linux] [Windows]
extcheck Utility to detect Jar conflicts. [Solaris and Linux] [Windows]

Security Tools

These security tools help you set security policies on your system and create apps that can work within the scope of security policies set at remote sites.
Tool Name Brief Description Links to Reference Pages
keytool Manage keystores and certificates. [Solaris and Linux] [Windows]
jarsigner Generate and verify JAR signatures. [Solaris and Linux] [Windows]
policytool GUI tool for managing policy files. [Solaris and Linux] [Windows]

These security tools help you obtain, list, and manage Kerberos tickets.

Tool Name Brief Description Links to Reference Pages
kinit Tool for obtaining Kerberos v5 tickets. Equivalent functionality is available on the Solaris operating system via the kinit tool. For example, for Solaris 8, see the kinit reference page. [Windows]
klist Command-line tool to list entries in credential cache and key tab. Equivalent functionality is available on the Solaris operating system via the klist tool. For example, for Solaris 8, see the klist reference page. [Windows]
ktab Command-line tool to help the user manage entires in the key table. Equivalent functionality is available on the Solaris operating system via the kadmin tool. For example, for Solaris 8, see the kadmin reference page. [Windows]

Internationalization Tools

This tool helps to create localizable apps.
Tool Name Brief Description Links to Reference Pages
native2ascii Convert text to Unicode Latin-1. [Solaris and Linux] [Windows]

Remote Method Invocation (RMI) Tools

These tools help to create apps that interact over the Web or other network.
Tool Name Brief Description Links to Reference Pages
rmic Generate stubs and skeletons for remote objects. [Solaris and Linux] [Windows]
rmiregistry Remote object registry service. [Solaris and Linux] [Windows]
rmid RMI activation system daemon. [Solaris and Linux] [Windows]
serialver Return class serialVersionUID. [Solaris and Linux] [Windows]

Java IDL and RMI-IIOP Tools

These tools are used when creating applications that use OMG-standard IDL and CORBA/IIOP.
Tool Name Brief Description
tnameserv Provides access to the naming service.
idlj Generates .java files that map an OMG IDL interface and enable an application written in the Java programming language to use CORBA functionality.
orbd Provides support for clients to transparently locate and invoke persistent objects on servers in the CORBA environment. ORBD is used instead of the Transient Naming Service, tnameserv. ORBD includes both a Transient Naming Service and a Persistent Naming Service. The orbd tool incorporates the functionality of a Server Manager, an Interoperable Naming Service, and a Bootstrap Name Server. When used in conjunction with the servertool, the Server Manager locates, registers, and activates a server when a client wants to access the server.
servertool Provides ease-of-use interface for the application programmers to register, unregister, startup, and shutdown a server.

Java Deployment Tools

Utilities for use in conjunction with deployment of java applications and applets on the web.
Tool Name Brief Description
pack200 Transforms a JAR file into a compressed pack200 file using the Java gzip compressor. The compressed packed files are highly compressed JARs, which can be directly deployed, saving bandwidth and reducing download time.
unpack200 Transforms a packed file produced by pack200 into a JAR file.

Java Plug-in Tools

Utilities for use in conjunction with the Java Plug-in.
Tool Name Brief Description with Links to Reference Pages
htmlconverter Converts an HTML page (file) containing applets to the OBJECT / EMBED tag format for Java Plug-in.

Java Web Start Tools

Utilities for use in conjunction with Java Web Start.
Tool Name Brief Description
javaws Command line tool for launching Java Web Start and setting various options.
See Java Web Start Guide for more information.

Java Troubleshooting, Profiling, Monitoring and Management Tools

Tool Name Brief Description
jvisualvm

A graphical tool that provides detailed information about the Java technology-based applications (Java applications) while they are running in a Java Virtual Machine. Java VisualVM provides memory and CPU profiling, heap dump analysis, memory leak detection, access to MBeans, and garbage collection.See Java VisualVM for more information.

jconsole A JMX-compliant graphical tool for monitoring a Java virtual machine. It can monitor both local and remote JVMs. It can also monitor and manage an application.
See Monitoring and Management for the Java Platform for more information.

Java Web Services Tools

Tool Name Brief Description
schemagen Schema generator for Java Architecture for XML Binding.
wsgen Tool to generate JAX-WS portable artifacts.
wsimport Tool to generate JAX-WS portable artifacts.
xjc Binding compiler for Java Ardchitecture for XML Binding.

Monitoring Tools

You can use the following tools to monitor JVM performance statistics. The tools described in this section are unsupported and experimental, and should be used with that in mind. They may not be available in future JDK versions.

These tools are supported on all platforms except Windows 98 and Windows ME.

Tool Name Brief Description
jps Experimental: JVM Process Status Tool - Lists instrumented HotSpot Java virtual machines on a target system.
jstat Experimental: JVM Statistics Monitoring Tool - Attaches to an instrumented HotSpot Java virtual machine and collects and logs performance statistics as specified by the command line options.
jstatd Experimental: JVM jstat Daemon - Launches an RMI server application that monitors for the creation and termination of instrumented HotSpot Java virtual machines and provides a interface to allow remote monitoring tools to attach to Java virtual machines running on the local system.

Troubleshooting Tools

The following tools can be used for specific troubleshooting tasks. The tools described in this section are unsupported and experimental in nature and should be used with that in mind. They may not be available in future JDK versions.

Some of these tools are not currently available on Windows platforms.

Tool Name Brief Description
jinfo Experimental - Configuration Info for Java - Prints configuration information for for a given process or core file or a remote debug server.
jhat Experimental - Heap Dump Browser - Starts a web server on a heap dump file (eg, produced by jmap -dump), allowing the heap to be browsed.
jmap Experimental - Memory Map for Java - Prints shared object memory maps or heap memory details of a given process or core file or a remote debug server.
jsadebugd Experimental - Serviceability Agent Debug Daemon for Java - Attaches to a process or core file and acts as a debug server.
jstack Experimental - Stack Trace for Java - Prints a stack trace of threads for a given process or core file or remote debug server.

Refer to the Java SE Troubleshooting web site for descriptions of tools, options, and other information to use in analyzing problems. The documents at this site contain suggestions about what to try before submitting a bug report and what data to collect for a report.


Scripting Tools

The following tool can be used to run scripts that interact with the Java platfrom. This tool is unsupported and experimental in nature and should be used with that in mind. It might not be available in future JDK versions.
Tool Name Brief Description
jrunscript Experimental - Script shell for Java - Runs a script.