Простой чат с использованием сокета

Я пытаюсь сделать простой чат. У меня есть сервер, который обслуживает больше клиентов. Это то, что я делал до сих пор: соединения, я могу определить на своем сервере, какой клиент отправляет сообщение, но проблема в том, что на клиенте я не могу получить полный разговор, как на сервере. Например

Client_1  (writing)
msg : hi

Client_2 (writing)
msg : hi from cl2

results 

Server :
Client_1 : hi
Client_2 : hi from cl2

Client_1 
Client_1 : hi

Client_2 
Client_2 :hi from cl2

Я хочу добиться, чтобы оба клиента имели ту же информацию, что и сервер.

My Server Script :
public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(1900);
        System.out.println("waiting");
        while (true) {
            Socket sock = server.accept();
            System.out.println("Client nou conectat !");
            ClientHandler cH = new ClientHandler(sock);
            cH.start();
        }
    }
}

class ClientHandler extends Thread {
    BufferedReader in;
    PrintWriter out;

    ClientHandler(Socket sock) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()),
                true);
        in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    }

    public void run () {
            try {
                out.println("Hello from server"); //hello message to client
        while (true) {
            String linie = in.readLine();
            if (linie==null)
                return;
            System.out.println(linie); //message from client 
            out.println(linie);
        }
    }catch(Exception e) {e.printStackTrace();}
        }
}

Клиентский скрипт

public class Client {
    public static void main(String[] args) throws Exception {
    //  String ip ="192.168.1.12";
        String ip ="localhost";
        Socket sock = new Socket(ip, 1900); // localhost daca ii pe
                                                        // acelasi pc serverul
                                                        // si clientul,altfel
                                                        // IPul
        PrintWriter out = new PrintWriter(new OutputStreamWriter(
                sock.getOutputStream()), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(
                sock.getInputStream()));
        String linie = in.readLine();
        System.out.println("Server :" + linie);//meesage from server
        BufferedReader console = new BufferedReader(new InputStreamReader(
                System.in));

        while (true) {
            linie = console.readLine();
            out.println("Client_1 :"+linie); // sending to server
            String linie2 =in.readLine();
            System.out.println(linie2); //resend message to client
        }
    }
}

Надеюсь, я хорошо объяснил свою проблему: D. Всем спасибо за советы


person Petrica    schedule 15.10.2013    source источник
comment
Вы не сказали откуда скопировали?   -  person Makky    schedule 15.10.2013
comment
Ну, у меня есть домашняя работа, чтобы идентифицировать каждого клиента, когда он отправляет сообщение, и получить тот же результат на стороне клиента, что и на стороне сервера.   -  person Petrica    schedule 15.10.2013
comment
Мне нужны подсказки, как передать информацию от клиента другому...   -  person Petrica    schedule 15.10.2013


Ответы (1)


На стороне вашего сервера.

Вы создаете ClientHandler для каждого подключения клиента к серверу, это нормально, а затем читаете то, что приходит от каждого ClientHandler.

Но каждый ClientHandler не зависит от того, сколько других клиентов находится на сервере, вам нужно «подключить их».

я бы создал

public class ClientDispatcher{

    private List<ClientHandler> clients;

}

и уведомлять этот ClientDispatcher о каждом сообщении, которое имеет ClientHandler, чтобы он мог «отправить» сообщение другим.

person RamonBoza    schedule 15.10.2013