Skip to main content

How do I create and communicate with a server socket

In this Q&A, we'll go over how to create a server socket, connect to the server and send/receive messages using Socket APIs

The demo code below does it. Server and client sockets are created in separate threads, they send/receive data and exit thread after that. 

package com.javahowdoi.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class SocketDemo {
        public static class Server implements AutoCloseable{
            private ServerSocket serverSocket;
            private Socket clientSocket;
            private PrintWriter out;
            private BufferedReader in;

            public void read(int port) throws IOException {
                serverSocket = new ServerSocket(port);
                clientSocket = serverSocket.accept();
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String greeting = in.readLine();
                System.out.println(greeting);
                out.println("hello client");
            }

            public void close() throws IOException {
                in.close();
                out.close();
                clientSocket.close();
                serverSocket.close();
            }
        }

        public static class GreetClient implements AutoCloseable{
            private Socket clientSocket;
            private PrintWriter out;
            private BufferedReader in;

            public void connectAndSend(String ip, int port) throws IOException {
                clientSocket = new Socket(ip, port);
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                System.out.println(sendAndReceiveMessage("hello server"));
            }

            private String sendAndReceiveMessage(String msg) throws IOException {
                out.println(msg);
                String resp = in.readLine();
                return resp;
            }

            public void close() throws IOException {
                in.close();
                out.close();
                clientSocket.close();
            }
        }
        public static void main(String[] args) throws Exception {
            ExecutorService es = Executors.newFixedThreadPool(2);
            es.submit( () ->  {
                try(Server s = new Server()){
                    s.read(6666);
                } catch(Exception e) {} }
            );
           Thread.sleep(1000);
            es.submit( () ->  {
                try(GreetClient s = new GreetClient()){
                    s.connectAndSend("localhost", 6666);
                } catch(Exception e) {} }
            );
            es.awaitTermination(2, TimeUnit.SECONDS);
            es.shutdown();
        }
}

Comments