Java Networking: A Guide to Network Programming
Explore Java networking and learn how to create programs that operate across multiple devices connected by a network. This comprehensive guide covers key concepts, protocols, and techniques essential for effective Java network programming.
Java Networking
Java networking (or Java network programming) refers to writing programs that execute across multiple devices (computers), where the devices are all connected to each other using a network.
Advantages of Java Networking
- Creating server-client applications
- Implementing networking protocols
- Implementing socket programming
- Creating web services
Packages Used in Networking
The java.net
package of the J2SE APIs contains classes and interfaces that provide low-level communication details, allowing programs to focus on solving the problem at hand.
Socket Programming in Java Networking
Sockets provide the communication mechanism between two computers using TCP (Transmission Control Protocol). Here’s how socket programming works in Java:
Server-Side Socket Programming
On the server side, the following steps occur:
- The server instantiates a
ServerSocket
object, specifying the port number. - The server invokes the
accept()
method of theServerSocket
class, which waits for a client connection. - After a client connects, a new
Socket
object is created on the server, connected to the client’s socket. - Communication occurs using I/O streams (both input and output).
Client-Side Socket Programming
On the client side:
- The client creates a
Socket
object, specifying the server name and port number. - The client connects to the server using the
connect()
method of theSocket
class. - Communication occurs similarly via I/O streams.
Example of Java Networking
Implementing Socket Client in Java
GreetingClient.java
import java.net.*;
import java.io.*;
public class GreetingClient {
public static void main(String [] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("Connecting to " + serverName + " on port " + port);
Socket client = new Socket(serverName, port);
System.out.println("Just connected to " + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Implementing Socket Server in Java
GreetingServer.java
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread {
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run() {
while(true) {
try {
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String [] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new GreetingServer(port);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}