Java Socket Programming – Socket Server, Client example

Filed Under: Java

Welcome to Java Socket programming example. Every server is a program that runs on a specific system and listens on a specific port. Sockets are bound to the port numbers and when we run any server it just listens on the socket and waits for client requests. For example, tomcat server running on port 8080 waits for client requests and once it gets any client request, it responds to them.

Java Socket Programming

java socket, java socket programming, java socket example

A socket is one endpoint of a two-way communication link between two programs running on the network. The socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent.

In java socket programming example tutorial, we will learn how to write java socket server and java socket client program. We will also learn how server client program read and write data on the socket.

java.net.Socket and java.net.ServerSocket are the java classes that implements Socket and Socket server.

Java Socket Server Example


package com.journaldev.socket;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * This class implements java Socket server
 * @author pankaj
 *
 */
public class SocketServerExample {
    
    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 9876;
    
    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for the client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client "+message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }
    
}

Java Socket Client


package com.journaldev.socket;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * This class implements java socket client
 * @author pankaj
 *
 */
public class SocketClientExample {

    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
        //get the localhost IP address, if server is running on some other IP, you need to use that
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        for(int i=0; i<5;i++){
            //establish socket connection to server
            socket = new Socket(host.getHostName(), 9876);
            //write to socket using ObjectOutputStream
            oos = new ObjectOutputStream(socket.getOutputStream());
            System.out.println("Sending request to Socket Server");
            if(i==4)oos.writeObject("exit");
            else oos.writeObject(""+i);
            //read the server response message
            ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message: " + message);
            //close resources
            ois.close();
            oos.close();
            Thread.sleep(100);
        }
    }
}

To test java socket programming of server-client communication, first we need to run SocketServerExample class. When you will run socket server, it will just print “Waiting for client request” and then wait for the client request.

Now when you will run SocketClientExample class, it will send a request to java socket server and print the response message to console.

Here is the output of java socket server SocketServerExample program.


Waiting for the client request
Message Received: 0
Waiting for the client request
Message Received: 1
Waiting for the client request
Message Received: 2
Waiting for the client request
Message Received: 3
Waiting for the client request
Message Received: exit
Shutting down Socket server!!

Here is the output of Java socket client SocketClientExample program.


Sending request to Socket Server
Message: Hi Client 0
Sending request to Socket Server
Message: Hi Client 1
Sending request to Socket Server
Message: Hi Client 2
Sending request to Socket Server
Message: Hi Client 3
Sending request to Socket Server
Message: Hi Client exit

That’s all for a quick roundup of Socket programming in java. I hope you can get started with java socket server and java socket client programming.

Reference: Oracle Doc

Comments

  1. myname says:

    This one works unlike the others you see some places. Great job Sir.

  2. Rachel says:

    Hello ^^ Thank you so much for your tutorial.
    I have a question though.
    I have been struggling with implementing the logic you implemented with a JavaEE web application (using war packaging).
    Do you have any idea how I can implement it ?

  3. sumit says:

    sir how to connect server remotely.which ip address should i put in “Socket s=new Socket(“localhost”,4103)”
    replacement of localhost.

  4. Kevin Ziadeh says:

    Do the server and client have to be run on the same computer?

    1. Pankaj says:

      No, but if they are on different computers/servers, make sure the ports are open for communication.

      1. NetW says:

        how can the server know if one or more clients are disconnecting?

  5. Md. Abdul Owares says:

    I have a TCP server setup which is receiving data from GPS Trackers. Each GPS devices initiates the request, server accepts it. Works well. Now, I want to use TCP to send commands to devices over GPRS for all kinds of configuration. what is the solution and how to do it in using JAVA?

    I also have the protocol manual where I can see available commands and their responses.

    example command for locating:

    server -> device

    **,imei:359586018966098,100 device -> server imei:353451044508750,001,0809231929,,F,055403.000,A,2233.1870,N,11354.3067,E,0.00,,;

    How can I send this command with JAVA ?

  6. Douglas says:

    Well explained. Thanks

  7. Rafael Cadenas says:

    Hi Pankaj,

    Thanks for this great post, I have a problem with an implementation, I am connecting to a socket and everything was going good until my customer started to complain that he was seeing issues from time to time they provided their logs and it seems like they are receiving the payload message split in two which is obviously causing problems. what could be wrong? this is part of my client implementation:

    try {
    socket = new Socket(settings.getApiDepositHost(), settings.getApiDepositPort());
    log.debug(“Writing request to the server”);

    // send the request
    PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
    output.print(request);
    output.flush();

    // read the response
    StringBuffer buffer = new StringBuffer();
    InputStreamReader input = new InputStreamReader(socket.getInputStream());
    char[] charBuffer = new char[1024];
    int read;

    // keep reading until the buffer is terminated with a tag
    do {
    do {
    read = input.read(charBuffer);

    if (read > 0) {
    buffer.append(charBuffer, 0, read);
    }
    } while (charBuffer.length == read);

    responseXml = buffer.toString();
    } while (!responseXml.endsWith(“</Tag"));
    socket.close();
    } catch (UnknownHostException e) {
    //handle error stuff here
    } catch (IOException e) {
    //handle error stuff here
    }

    I've tried to reproduce this but it has not been possible.

  8. Sikander Bhardwaj says:

    Hi Pankaj,

    Thanks for the article. Its running fine on Intranet but I am not able to connect it over internet. Please suggest something.

    1. Pankaj says:

      Must be some firewall blocking it and ports are not open.

      1. Sikander Bhardwaj says:

        I have disabled the firewall but its not working. I have created a Remote desktop application which overs in fine in my office LAN but I am not able to connect outside LAN. Is it possible for you to connect with me over email so that I can share my code with you. I ll grateful to you if you help me.

        1. Rudraa Kumar says:

          Hi Sikander how define client messge

          ex – my client send this

          $,LGN,MARK,DL20DL2020,358980100027391,V0.0.1,AIS140,28.359961,N,76.927612,E
          Response should be – $LGN20202020121212*

          or if client send this
          $,HBT,MARK,V0.0.1,358980100027391,38,20,0,20,20,0000,0.1,*
          then response should be – $HBT*
          please help

          package com.journaldev.socket;

          import java.io.IOException;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutputStream;
          import java.lang.ClassNotFoundException;
          import java.net.ServerSocket;
          import java.net.Socket;

          /**
          * This class implements java Socket server
          * @author pankaj
          *
          */
          public class SocketServerExample {

          //static ServerSocket variable
          private static ServerSocket server;
          //socket server port on which it will listen
          private static int port = 9876;

          public static void main(String args[]) throws IOException, ClassNotFoundException{
          //create the socket server object
          server = new ServerSocket(port);
          //keep listens indefinitely until receives ‘exit’ call or program terminates
          while(true){
          System.out.println(“Waiting for the client request”);
          //creating socket and waiting for client connection
          Socket socket = server.accept();
          //read from socket to ObjectInputStream object
          ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
          //convert ObjectInputStream object to String
          String message = (String) ois.readObject();
          System.out.println(“Message Received: ” + message);
          //create ObjectOutputStream object
          ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
          //write object to Socket
          oos.writeObject(“Hi Client “+message);
          //close resources
          ois.close();
          oos.close();
          socket.close();
          //terminate the server if client sends exit request
          if(message.equalsIgnoreCase(“exit”)) break;
          }
          System.out.println(“Shutting down Socket server!!”);
          //close the ServerSocket object
          server.close();
          }

          }

      2. Ch.LE0 says:

        hey Pankaj thanku for tutorial but i’ve a queation ( whan destination device storage is full then my app start crashing) how to handle this bug ..will be very thankful

  9. Jeisy says:

    Very good! It helps a lot, thank you so much.

  10. testtr says:

    Please do increase(width wise) the content container, it seems weird to read in such a small container, rest all of the space is just lying vacant

  11. sumit lohan says:

    i want that the client starts responding when it gets data from server. How can i do it?

  12. Kranthi Kumar says:

    Hi Pankaj,

    I was doing socket connection and I have to read character by character. But the read method is never reaching EOF(i.e never getting -1) until I close my connection, But I cannot open and close the connection for multiple records. Is there anyway to solve this? Also while writing data, I am only able to use println method but not write method.

  13. Lucio Jose Beirao says:

    Great implementation to start working with socket communication. The use of Object(Input/Output)Stream was very appreciated, many thanks for this.

  14. kervin Cortez says:

    hello good afternoon, I just read your post and I found it quite interesting, but I would like to know this connection that is made a travz of applications java can get to have communication through the internet. is that I am new in this language … is that I am creating a java application that they have to communicate but they are far away and the only way to communicate is through the internet. Can work?

    1. chutki says:

      good question but no relevant in this context

      1. diwagar says:

        yes..of course!!!!!!!

  15. avneet says:

    how can I test this in the different computer?

    1. sunusi aminu says:

      You only need to connect the two computers using either wi-fi or cable.

      1. tushar khatyri says:

        i want to connect two pc on a different location, how can i do this…
        not by the cable or wifi.
        but with different location pc.

  16. ibtissem says:

    thank you so much but it’s not enough for me

    1. sunusi aminu says:

      What do you want included to have enough?

      1. sajid says:

        i want more deep in socket programming so dude .thank you its my opinion.

  17. nitu says:

    thank for this article is very informative but I want more information so please share on the web

  18. pranit patil says:

    Thanks a lot for this detail about socket programming in java. As beginner i was looking for this socket programming guide and information. You have defined it so well as it is so important for making program run. Keep sharing.

  19. Ravindu Saluwadana says:

    Hi guys,
    is anyone can tell me how to pass jforms data to anothor jform through localhost?

  20. Manqoba Ledwaba says:

    hi guys,

    May you please assist.

    how can I send an xml message to a server & read the server response.

  21. swap says:

    any one tell me ….
    multiclent serverSocket ………
    in java, there is any provision for accessing thread from outside class.
    thread is one of socket client …
    ?????

    1. Any One says:

      multiclent serverSocket ………
      in java, there is any provision for accessing thread from outside class.
      thread is one of socket client …

  22. chetan Pawar says:

    i am working on spring integration i try to hit controller from device but it can not send data to controller…how it can do….

    1. Nazim Techwala says:

      working on spring integration i try to hit controller from device but it can not send data to controller
      I understand your question. Good question. Answer is simple and good also. Here is answer, you hit one more time and check. If still no work, then hit pc on ground. Will work for sure. Worked for me.

  23. Saranya says:

    Hai Pankaj

    Thanks for this article..

    I am working with client server communication…Clients sends a request, server reads that request, and sends a response, lastly client reads the response.I tried to implement with the help of many examples.But the client sends a request successfully, and the server reads it and responses successfully but the client then cannot get the response.Please help me….

  24. KoolMaan says:

    I am working on Socket & also you had given a good & nice example but i have a problem in implementing it,
    I have made a server socket and client socket they are working good but when i want to communicate from other client it does not respond to that client. Please help me i am working on it for a month & i am unable to figure this out.
    Please reply me as soon as possible……..

    1. Pankaj says:

      If you can send me program, I can check it out. Without having any insight of the issue, it’s not possible to provide any solution.

      1. Saranya says:

        Hai Pankaj…..

        I am new to socket programming..I am working with client server communication…Clients sends a request, server reads that request, and sends a response, lastly client reads the response.I tried to implement with the help of many examples.But the client sends a request successfully, and the server reads it and responses successfully but the client then cannot get the response.Please help me….

        1. Niraj says:

          Try to use the UDP protocol. I guess it will help!!!

      2. Tejaswi says:

        Hello pankaj,
        This is Tejaswi.I am doing my thesis and i am responsible for wireless connetivity.I have to use a client-server architectire.For that i am using texas instruments simple link wifi(cc3200 ) and an android.I have to send data using TCP connection.There is list of sensors attached to cc3200 .if a client request for a sensor data it just give an information regarding that data.I don’t have any idea how to structure the data.Could you please help me to find a solution.

        Thanks in advance…………….

        Best regards,
        Tejaswi

  25. Jonathan says:

    Thanks for this article, It’s really help
    you’re awesome Man

  26. shinu says:

    where i put server socket file in real server

    1. Jonathan says:

      You can put anywhere you want, you just need to compile (javac SocketServerExample.java) and then run (java SocketServerExample)

  27. Manish says:

    Hi Pankaj
    Thanks for this article ..
    I am working on Vehicle tracking system. Device is already implemented in one place and IP and port is integrated with that GPS device . I need to received data from that gps device . If you have any sample work in java , please share with me .
    Thanks

    1. amir says:

      Hi Pankaj
      Thanks for this article ..
      I am working on Vehicle tracking system. Device is already implemented in one place and IP and port is integrated with that GPS device . I need to received data from that gps device . If you have any sample work in java , please share with me .
      Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages