States
States

Reputation: 163

Handle more clients

Right now my server only can handle one client at a time. I am trying to use a Thread so that the server can handle several clients, but I am doing it wrong. I have added the thread in the try/catch clause where the serverSocket accepts the client, but this makes no difference. I don't get an error or anything, but it just doesn't work. So what I want to do, is make the server not freeze at one client, but still accept several clients.

Here is the server code:

import java.io.*;
import java.net.*;    

public class Server {

    private BufferedReader reader;
    private PrintWriter writer;
    private int port;

    public Server(int port)
    {
        this.port = port;
    }

    private String getSeverAddress() {      
        String host = null;
        try {
            InetAddress adr = InetAddress.getLocalHost();
            host = adr.getHostAddress();

        } catch (UnknownHostException e) {          
            e.printStackTrace();
        }

        return host;
    }

    public void startServer() {

        print("Contact this sever on address: " + getSeverAddress() + " port: " + port);

        ServerSocket ss = null; 
        Socket socket = null;
        Thread clientThread = null;


        try {
            ss = new ServerSocket(port);
            socket = ss.accept();                               

            clientThread = new Thread(new Client(socket));
            clientThread.start();

            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream(), true);

            String msg = null;

            while (( msg = reader.readLine())  != null) {
                print("System out: " + msg);    

                if(msg.equals("Bye")) {
                    print("Client left");
                    break;
                }
            }

            ss.close();
            socket.close();
            reader.close();
            writer.close();

        } catch(SocketException e) {
            e.printStackTrace();            
        } catch (IOException i ) {
            i.printStackTrace();
            return;
        }

    }       

    private void print(String msg) {
        System.out.println(msg);
    }

    public static void main(String[] args) {

        Server server = new Server(1111);
        server.startServer();

    }
}

Here is the client code:

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client implements Runnable{

    private Socket client;
    private BufferedReader reader;
    private PrintWriter writer;

    public Client(Socket socket)
    {
        client = socket;

        try{
            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            writer = new PrintWriter(client.getOutputStream(), true);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

    @Override
    public void run() {

        String msg = null;
        BufferedReader r = null;

        try {
            r = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        System.out.println("Write message to server");

        while(true) {
            try {
                msg = r.readLine();

                if(msg.equals("Quit") || msg == null) {
                    print("Disconnect");
                    break;
                }   
            } catch (IOException e) {
                e.printStackTrace();
            }
            writeToServer(msg);                         
        }

        try {
            r.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }

    public void writeToServer(String msg) {                     
        writer.println(msg);                
    }

    private void print(String msg) {
        System.out.println(msg);
    }

    public static void main(String[] args) {
        Socket socket = null;

        try {
            socket = new Socket("localhost", 1111);         

        } catch (Exception e) {
            e.printStackTrace();
        } 

        Client client = new Client(socket);
        client.run();
    }

}

Upvotes: 0

Views: 62

Answers (2)

Piotr Praszmo
Piotr Praszmo

Reputation: 18340

You are still trying to handle clients in your main thread. Main thread should just accept new connections and start new threads. You also have to do accept in a loop so multiple connections can be accepted:

ss = new ServerSocket(port);
while(true) {
    Socket socket = ss.accept();                               
    Thread clientThread = new Thread(new Runnable() {
        public void run() {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);

            String msg = null;

            while (( msg = reader.readLine())  != null) {
                print("System out: " + msg);    

                if(msg.equals("Bye")) {
                    print("Client left");
                    break;
                }
            }

            socket.close();
            reader.close();
            writer.close();
        }});
    clientThread.start();
}

Upvotes: 1

Codeversum
Codeversum

Reputation: 327

You need to put your ss.accept() into a while loop and create a new Thread for every client accepted, which handles the connection.

Upvotes: 0

Related Questions