socket programming multiple client to one server socket programming multiple client to one server java java

socket programming multiple client to one server


For every client you need to start separate thread. Example:

public class ThreadedEchoServer {    static final int PORT = 1978;    public static void main(String args[]) {        ServerSocket serverSocket = null;        Socket socket = null;        try {            serverSocket = new ServerSocket(PORT);        } catch (IOException e) {            e.printStackTrace();        }        while (true) {            try {                socket = serverSocket.accept();            } catch (IOException e) {                System.out.println("I/O error: " + e);            }            // new thread for a client            new EchoThread(socket).start();        }    }}

and

public class EchoThread extends Thread {    protected Socket socket;    public EchoThread(Socket clientSocket) {        this.socket = clientSocket;    }    public void run() {        InputStream inp = null;        BufferedReader brinp = null;        DataOutputStream out = null;        try {            inp = socket.getInputStream();            brinp = new BufferedReader(new InputStreamReader(inp));            out = new DataOutputStream(socket.getOutputStream());        } catch (IOException e) {            return;        }        String line;        while (true) {            try {                line = brinp.readLine();                if ((line == null) || line.equalsIgnoreCase("QUIT")) {                    socket.close();                    return;                } else {                    out.writeBytes(line + "\n\r");                    out.flush();                }            } catch (IOException e) {                e.printStackTrace();                return;            }        }    }}

You can also go with more advanced solution, that uses NIO selectors, so you will not have to create thread for every client, but that's a bit more complicated.


This is the echo server handling multiple clients... Runs fine and good using Threads

// echo serverimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Server_X_Client {public static void main(String args[]){    Socket s=null;    ServerSocket ss2=null;    System.out.println("Server Listening......");    try{        ss2 = new ServerSocket(4445); // can also use static final PORT_NUM , when defined    }    catch(IOException e){    e.printStackTrace();    System.out.println("Server error");    }    while(true){        try{            s= ss2.accept();            System.out.println("connection Established");            ServerThread st=new ServerThread(s);            st.start();        }    catch(Exception e){        e.printStackTrace();        System.out.println("Connection Error");    }    }}}class ServerThread extends Thread{      String line=null;    BufferedReader  is = null;    PrintWriter os=null;    Socket s=null;    public ServerThread(Socket s){        this.s=s;    }    public void run() {    try{        is= new BufferedReader(new InputStreamReader(s.getInputStream()));        os=new PrintWriter(s.getOutputStream());    }catch(IOException e){        System.out.println("IO error in server thread");    }    try {        line=is.readLine();        while(line.compareTo("QUIT")!=0){            os.println(line);            os.flush();            System.out.println("Response to Client  :  "+line);            line=is.readLine();        }       } catch (IOException e) {        line=this.getName(); //reused String line for getting thread name        System.out.println("IO Error/ Client "+line+" terminated abruptly");    }    catch(NullPointerException e){        line=this.getName(); //reused String line for getting thread name        System.out.println("Client "+line+" Closed");    }    finally{        try{        System.out.println("Connection Closing..");        if (is!=null){            is.close();             System.out.println(" Socket Input Stream Closed");        }        if(os!=null){            os.close();            System.out.println("Socket Out Closed");        }        if (s!=null){        s.close();        System.out.println("Socket Closed");        }        }    catch(IOException ie){        System.out.println("Socket Close Error");    }    }//end finally    }}

Also here is the code for the client.. Just execute this code for as many times as you want to create multiple client..

// A simple Client Server Protocol .. Client for Echo Serverimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;public class NetworkClient {public static void main(String args[]) throws IOException{    InetAddress address=InetAddress.getLocalHost();    Socket s1=null;    String line=null;    BufferedReader br=null;    BufferedReader is=null;    PrintWriter os=null;    try {        s1=new Socket(address, 4445); // You can use static final constant PORT_NUM        br= new BufferedReader(new InputStreamReader(System.in));        is=new BufferedReader(new InputStreamReader(s1.getInputStream()));        os= new PrintWriter(s1.getOutputStream());    }    catch (IOException e){        e.printStackTrace();        System.err.print("IO Exception");    }    System.out.println("Client Address : "+address);    System.out.println("Enter Data to echo Server ( Enter QUIT to end):");    String response=null;    try{        line=br.readLine();         while(line.compareTo("QUIT")!=0){                os.println(line);                os.flush();                response=is.readLine();                System.out.println("Server Response : "+response);                line=br.readLine();            }    }    catch(IOException e){        e.printStackTrace();    System.out.println("Socket read Error");    }    finally{        is.close();os.close();br.close();s1.close();                System.out.println("Connection Closed");    }}}


I guess the problem is that you need to start a separate thread for each connection and call serverSocket.accept() in a loop to accept more than one connection.

It is not a problem to have more than one connection on the same port.