×

Java Socket Programming

Java Socket Programming

Socket programming is used for the communication between the applications, i.e., client and server running on different JRE may be connection-oriented or connectionless. The client program can be designed using the Socket class. The server program can be created using the ServerSocket class. Both Socket and ServerSocket classes are the inbuilt classes in the java.net package. A client program instantiates a Socket object on its end in the communication and attempts to connect the Socket to a server. When the connection is made, the server can communicate by writing to and reading from the Socket.

The following steps occur when establishing a connection between two computers using sockets:

  • The server creates a ServerSocket object that denotes on which port number communication is going to occur.
  • The server calls the accept() method of the ServerSocket class. The accept() method waits until a client connects to the server on the given port.
  • A client creates a Socket object, indicating the server name and the port number to which it connects on the internet.
  • The accept() method gives a reference to a Socket on the server that is connected to the client’s Socket.
  • After the connection is established, communication can occur using I/O streams. Every Socket has both an OutputStream and InputStream. The OutputStream of the client is connected to the server’s InputStream, and the client’s InputStream is connected to the server’s OutputStream. In two-way communication, the data can be sent across both streams at the same time.

The Socket class

Socket class indicates the socket that both the client and the server used to communicate with each other. The client has a Socket object by instantiating its class, rather than the server gets the object of Socket by the return value of the accept() method. Socket class designs a client program.

The constructor of the Socket class:

Syntax:

Socket s=new Socket(“localhost”,8080); //localhost—port name and 8080—port number
Constructor Description
public Socket(String host1, int port1)throws UnknownHostException, IOException This method attempts to connect to a specific server at a specific port.
public Socket(InetAddress host1, int port1)throws IOException It indicates to connect to the specified server at the specified port, except that the host denotes an InetAddress object.
public Socket(String host, int port, InetAddress inet, int localPort)throws IOException It connects to the specified host and port, creating a socket on the localhost at a specified address and port.
public Socket(InetAddress host1, int port, InetAddress localAdd, int localPort)throws IOException It is identical to the previous constructor, and the host denotes the InetAddress object instead of a String.
public Socket() This method is used to create an unconnected socket. The connect() method is used to connect this socket to a server.

Method of Socket class

Method Description
public void connect(SocketAddress host1, int timeout1)throws IOException This method connects the socket to the particular host. This method is used when you instantiate the socket using the no-argument constructor.
public InetAddress getInetAddress(void) It returns the address of the other computer when the socket is connected to the internet.
 public int getLocalPort() It returns the port to which the socket is bound to, on the local machine.
public SocketAddress getRemoteSocketAddress() It returns the address of the remote socket.
public InputStream getInputStream()throws IOException It returns the input stream of the socket. The input stream connects to the output stream of the remote socket.
public OutputStream getOutputStream()throws IOException It returns the output stream of the socket. The output stream connects to the input stream of the remote socket.
public void close() throws IOException It closes the socket, which makes this Socket object no longer capable of connecting again to any server.

public OutputStream getOuputStream() :

The above method writes on the data from the client program to the server program and from the server program to the client program, which returns the OutputStream class object. A syntax is given below that tells how we can use it in the Socket class:

Syntax:

Socket s=new Socket(“localhost”,8080);
OutputStream os=new s.getOutputStream();
DataOutputStream dis=new DataOutputStream(os);

public InputStream  getInputStream()

It is used by the server to read the data from the client system or by the client from the server system that returns an InputStream class object.

A syntax is given below that tells how we can use it in the Socket class:

Syntax:

Socket s=new Socket(“localhost”,10);
InputStream input=new s.getInputStream();
DataInputStream datainput=new DataInputStream(is);

 public synchronized void close()

To close an object of Socket class or it is used to close client requests. A syntax is given below that tells how we can incorporate it in the Socket class:

Syntax:

Socket s=new Socket(“localhost”,8080);
s.close(); 

The ServerSocket class

This class can be used to create a ServerSocket instance that is used by server applications to listen to client’s requests. If the application has successfully bound to the specified port, the ServerSocket constructor does not throw an exception and is ready for client requests.

The ServerSocket class has four constructors:

Constructor Description
public ServerSocket(int port)throws IOException It attempts to create a ServerSocket that binds to the given port.
public ServerSocket(int port, int backlogs)throws IOException It also attempts to create a ServerSocket bound to the specified port, and the backlogs parameter specifies how many incoming clients have to be stored in await queue.
public ServerSocket(int port, int backlog, InetAddress add)throws IOException It also attempts to create a ServerSocket instance as above, and the InetAddress parameter that specifies the local IP address. The InetAddress is used for the servers that have multiple IP addresses, allowing the server to specify which of its IP addresses are accepting client requests on the internet.
public ServerSocket() throws  IOException It creates an unbound server socket. It uses the bind() method when you are ready to bind the server socket.

Methods of the ServerSocket class

Method Description
public int getLocalPort() It returns the port of the server socket, which is listening on the network.
public Socket accept()throws IOException It waits for an incoming client.
public void setSoTimeout(int timeout) It sets the time-out value for how long the server socket waits for a client during the accept() method.
public void bind(SocketAddress host, int backlog) This method binds the Socket to the specified server and port in the SocketAddress object.

When the ServerSocket calls accept(), the method does not return until a client connects. After a client connects, the ServerSocket creates a new Socket on an unspecified port and returns a reference to this new socket. A connection now exists between the client and the server, and communication can begin. ServerSocket object is used to communicate with clients. ServerSocket class is used to design a server program. It has some constructors and methods that are used in designing the server program. ServerSocket class contains a constructor that is used to create a separate port number to run the server program.

Syntax:

ServerSocket ss=new ServerSocket(8080);

public Socket accept()

It is used to accept the client's request on the internet. The following syntax is given below, which tells how we can use it in the ServerSocket class.

Syntax:

Socket s=new Socket(“localhost”,8080);
ServerSocket ss=new ServerSocket(8080);
Socket s=ss.accept(); 

The following are some examples of TCP protocol:

Example 1: One-way communication from the client to the server.

 Client-side programming:

import java.net.*;
import java.io.*;
class Client
{
public static void main(String s1[])
{
try
{
Socket s=new Socket("localhost",20); //creates the socket instance
System.out.println(s);
//DataOutputStream class is to create an output stream to send response to the server.
DataOutputStream d1=new DataOutputStream(s.getOutputStream());
d1.writeUTF("hello server");
d1.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
} 

Server side programming

import java.net.*;
import java.io.*;
class Server
{
public static void main(String s1[])
{
try
{
ServerSocket ss=new ServerSocket(20);
System.out.println("server is started......");
Socket s=ss.accept();  //establishing connection  and waits for the client.
System.out.println(s);
//DataInputStream class is to create an input stream to receive a response from the client.
DataInputStream ds=new DataInputStream(s.getInputStream());
String msg=(String)ds.readUTF();
System.out.println(msg);
}
catch(Exception e)
{
e.printStackTrace();
}
}
} 

The output of the client:

client side programming

The output of the server:

client side programming

Example 2: Peer to peer chatting, i.e., (Read-Write from both side) Two-way communication:

The client first writes to the server, then the server receives and prints the text. Then the server writes to the client, and the client receives and prints the text.

Client side programming:

import java.net.*; 
import java.io.*; 
class MyClient1{ 
public static void main(String s1[])throws Exception{ 
Socket s=new Socket("localhost",10); 
//DataInputStream class is to create an input stream to receive response from the server.
DataInputStream din=new DataInputStream(s.getInputStream()); 
//DataOutputStream class is to create output stream to send information to the server socket.
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
BufferedReader br3=new BufferedReader(new InputStreamReader(System.in));   
String str="",str2=""; 
while(!str.equals("stop")){ 
str=br3.readLine(); 
dout.writeUTF(str); 
dout.flush(); 
str2=din.readUTF(); 
System.out.println("Server says: "+str2); 
}   
dout.close(); 
s.close(); 
}}  

Server side programming:

import java.net.*; 
import java.io.*; 
class MyServer1{ 
public static void main(String s2[])throws Exception{ 
ServerSocket ss=new ServerSocket(10); 
Socket s=ss.accept(); 
// DataInputStream creates  an input stream to receive input from the client.
DataInputStream din=new
DataInputStream(s.getInputStream()); 
//DataOutputStream creates an output stream to send information to the client.
DataOutputStream dout=new
DataOutputStream(s.getOutputStream()); 
BufferedReader br=new BufferedReader
(new InputStreamReader(System.in)); 
String str="",str2=""; 
while(!str.equals("stop")){ 
str=din.readUTF(); 
System.out.println("client says: "+str); 
str2=br.readLine(); 
dout.writeUTF(str2); 
dout.flush(); 
} 
din.close(); 
s.close(); 
ss.close(); 
}}  

The output of the client:

Server side programming

 The output of the server:

Client Side

Example 3: Echo Server for communication:  Whatever message the client writes, it reflects towards the client as it is, from the server

The client side:

import java.io.*;
import java.net.*;
public class MyClient2
{            
Socket s;
DataInputStream din;
DataOutputStream dout;
public MyClient2()
{
try
{
s=new Socket("localhost",10);
System.out.println(s);
din=new DataInputStream(s.getInputStream());
dout=new DataOutputStream(s.getOutputStream());
clientChat();
}
catch(Exception e)
{
System.out.println(e);
}
}
public void clientChat() throws IOException
{
BufferedReader br3=new BufferedReader(new InputStreamReader(System.in));
String s1;
do
{
s1=br3.readLine();
dout.writeUTF(s1);
dout.flush();
System.out.println("server message:"+din.readUTF());
}
while(!s1.equals("stop"));
}
public static void main(String s[])
{
new  MyClient2();
}
} 

The server side:

import java.io.*;
import java.net.*;
public class MyServer2
{
ServerSocket ss;
Socket s;
DataInputStream dis;
DataOutputStream dos;
public MyServer2()
{
try
{
System.out.println("server started");
ss=new ServerSocket(10);
s=ss.accept();
System.out.println("client connected");
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
serverChat();
}
catch(Exception e)
{
System.out.println(e);
}
}
public static void main(String s[])
{
new MyServer2();
}
public void serverChat() throws IOException{
String str;
do
{
str=dis.readUTF();
System.out.println("client message"+str);
dos.writeUTF(str);
dos.flush();
}
while(!str.equals("stop"));
}
} 

The output of the client:

Client Side

The output of the server:

server side

Limitations of Socket programming

  1. You can share the resources locally but not globally.
  2. You cannot develop internet-based applications.
  3. You can develop only half-duplex applications.
  4. You cannot get services from universal protocols like http, ftp, etc.
  5. You cannot get services from universal server software like Tomcat, WebLogic, etc.

Note: Servlet and JSP technology has overcome these limitations.


Related Topics

Lambda expressions in Java

A brief introduction to Lambda expression in java In this topic, we will discuss the lambda expression in java. A lambda expression in Java is an enhanced version of an anonymous...

13 minutes read.

How to create an array in Java

An array is a linear data structure stores a collection of fixed number ofelements of similar type. The size of an array is specified when it is created. The array...

14 minutes read.

Java Maven Silicon

Maven is a build automation tool that is mostly used for Java applications. It allows you to manage the build, reporting, and documentation of a project from the central location. Maven provides...

4 minutes read.

Reserved Keywords in Java

In Java, a reserved term is used as a code key called a keyword. Because they are predefined, these terms cannot be used for anything else. They cannot serve as...

3 minutes read.

Java Hello World

Let’s start by writing a simple program that prints “Hello World” to the output window. Write the program into any text editor or IDE (Eclipse, Netbeans, etc.) and save the file with the...

2 minutes read.

Java.net.ConnectionException

java.net.ConnectException: Connection rejected: the interface is the most continuous sort of happening, organizing special cases in Java at whatever point the product is in client-server engineering and attempting to make...

3 minutes read.

How to declare string array in Java

Introduction Array is a data structure with a fixed size, which allows us to store elements of similar type. Data of primitive types like int, char, float, string, etc. can be...

2 minutes read.

How to Concatenate Two Strings in Java

How to Concatenate Two Strings in Java Concatenation of two strings means adding the beginning of one string to the end of the other string. Some of the ways to concatenate...

3 minutes read.

Java Math sin() Method

The sin() method of Java Math class returns the trigonometric sine of the specified angle. Syntax: public static double sin(double a) Parameters: The parameter ‘a’ represents an angle measured in radians. Return Value: The sin() method...

1 minute read.

Java Tokens

Classes and methods are included in the Java program. The procedures also provide the expressions and statements required to finish a specific operation. Tokens make up the sentences and expressions...

4 minutes read.

Best Java Security Framework

The security of applications is currently our top concern when creating them. The applications or bits of code running over the network are exposed to dangers and may jeopardize integrity,...

3 minutes read.

Java Integer getInteger() method

The getInteger() method of Integer class determines the integer value of the system property with the given name. Syntax` public static Integer getInteger(String nm) Parameters The parameter ‘nm’ represents the property name. Throws The getInteger ()...

1 minute read.

Java class class

Java Class class instances are an executing Java application's implementation of the classes and interfaces. As well as, every Array is indeed an object that is common for all Arrays...

6 minutes read.

Recursion Program in Java

The recursion program in Java demonstrates the usage of recursion. The process by which a function/ method calls itself, again and again, is called recursion. Each recursive call is pushed...

10 minutes read.

Contextual keywords in Java

Contextual keywords were earlier known as restricted identifiers and restricted keywords. Context keywords are chosen based on their expected placement in the syntactic grammar. These are the keywords in the code...

3 minutes read.

StringBuffer in Java

StringBuffer in Java Similar to StringBuilder, the Java StringBuffer class is also used to create modifiable or mutable strings. The StringBuilder class is synchronized, i.e., thread-safe. Java StringBuffer ConstructorThe StringBuffer class has...

7 minutes read.

Java Do While Loop

When we wish to test the exit condition at the end of the loop, we use a do-while loop. The do-while loop always executes its body at least once, because...

1 minute read.

Java Xml Parser

In this article, we acknowledge you about what is a XML parser in Java, how is it going to work and what is the purpose of it. Also, the article discusses...

6 minutes read.

Median Of Stream Of Running Integers in Java

An integer array is given to us. Compute the median of the elements traversed so far in the input array. For the sake of simplicity, assume that there are no...

10 minutes read.

Java Integer lowestOneBit()

The lowestOneBit () method of Java Integer class returns an int value with at most a single one-bit, in the position of the lowest-order one-bit in the specified int value.  Syntax public...

2 minutes read.