Souin
Souin

Reputation: 94

Muti - threaded Web Server in Java

I'm trying to build a server with Java. My question is: how to do if I have multiple users at the same time? The answer is: multi threading. But I don't know how to do.

For example, if there is two client connected at the same time, and a server (who does 2*number) : if the client1 say "50" to the server and the client 2 "10", the server is supposed to return "100" to the first client and "20" to the second. But i'm not sure my code works.

Server side:

public class Server {
public static void main(String[] args){
    ServerSocket socket;
    try {
    socket = new ServerSocket(4444);
    Thread t = new Thread(new Accept(socket));
    t.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class Accept implements Runnable {
   private ServerSocket socketserver;
   private Socket socket;
   private int nbrclient = 1;
    public Accept(ServerSocket s){
        socketserver = s;
    }
    public void run() {
        try {
          socket = socketserver.accept();
          in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);

            out = new PrintWriter(socket.getOutputStream());
            out.println("Pong");
            out.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Client side:

 public class Client {
    public static void main(String[] zero) {    
        Socket socket;
        BufferedReader in;
        PrintWriter out;
        try {
            socket = new Socket(InetAddress.getLocalHost(),4444);   
            out = new PrintWriter(socket.getOutputStream());
            out.println("Ping");
            out.flush();
            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);
            socket.close();
        }catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

}

If you have any ideas (how to do multi-threading and how to verify if my code works, like run two Clients.java and check if the multi-threading works)

Upvotes: 1

Views: 95

Answers (1)

Vlad Călin Buzea
Vlad Călin Buzea

Reputation: 559

The Server sides needs a while loop:

public class Server {
public static void main(String[] args){
    ServerSocket socket;
    try {
        while(true){
            socket = new ServerSocket(4444);
            Socket socketInstance = socket.accept();
            Thread t = new Thread(new Accept(socketInstance));
            t.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class Accept implements Runnable {
   private Socket socket;
   private int nbrclient = 1;
    public Accept(Socket s){
        socket = s;
    }
    public void run() {
        try {

            in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
            String message = in.readLine();
            System.out.println(message);//this message should be your number
            Double number = Double.parseString(message);

            out = new PrintWriter(socket.getOutputStream());
            //out.println("Pong");
            out.println(2*number +"");
            out.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

The client side looks ok. Just replace out.println("Ping"); with out.println("50"); or whatever you want.

You first start the server and then you can start multiple client applications. If you have any errors you can then post them here and have a look on an exact scenario.

Upvotes: 1

Related Questions