есть ли способ отправить сообщение с сервера одному клиенту только в Java сокетах? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь создать приложение для сервера и клиента. Клиент отправит данные для входа (адрес электронной почты и пароль) на сервер. тогда сервер ответит клиенту, правильны ли данные для входа или нет. проблема в том, что я хочу, чтобы сервер отвечал только клиенту, который отправил только данные для входа. Обратите внимание, что я хочу оставить методы класса обобщенными c, чтобы их можно было использовать в классах контроллеров GUI (Javafx). как мне этого добиться?

public class ServerConnector extends Thread{

    public static final int PORT_NO = 5005;
    private ServerSocket serverSocket;

    /**
     * Starts the server
     */
    public void startServer() {
       this.start();
    }

    @Override
    public void run() {
       Socket clientSocket;
        try {
            serverSocket = new ServerSocket(PORT_NO);
            while (true) {
                clientSocket = serverSocket.accept();
                new ClientHandler(clientSocket);
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        } 
    }
}
public class ClientHandler extends Thread {

    private DataInputStream dis;
    private PrintStream ps;
    private Socket clientSocket;


    public static Vector<ClientHandler> clientThreads = new Vector<ClientHandler>();

    public ClientHandler(Socket s) {
        try {         
            this.clientSocket = s;
            dis = new DataInputStream(clientSocket.getInputStream());
            ps = new PrintStream(clientSocket.getOutputStream());
            clientThreads.add(this);
            start();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void printMsg(String msg) {
        System.out.println(msg);
    }

    @Override
    public void run() {
        while (true) {

            try {
                String str = dis.readLine();
                if(str.equals("JavaTODO_ClientFINISH"))
                {
                    System.out.println("JavaTODO_ClientFINISH");
                    clientThreads.remove(this);
                    this.stop();
                }
                else
                {
                    System.out.println(str);
                }
            } catch (IOException ex) {
               ex.printStackTrace();
            } 
        }
    }

    /**
     * sends message to all clients connected to the server
     *
     * @param msg to be sent
     */
    public static void sendToAll(String msg) {
        for (ClientHandler ch : clientThreads) {
            ch.ps.println(msg);
        }
    }

    /**
     * sends message to one client
     *
     * @param msg to be sent to one client
     */
    public void sendToOneClient(String msg,int index) {     
            ps.println(msg);
            //clientThreads.get(index).ps.println(msg);
            //psStatic.println(msg);    
    }

    /**
     * close the open connection and release resources
     */
    public void closeConnection() {
        try {
            dis.close();
            ps.close();
            clientSocket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 30 января 2020

Просто добавьте тип повара ie. Повар ie - это не что иное, как строка, отправленная вместе с запросом.

 cookie=login_id:33384adeg73eg344;

Только после успешного входа в систему им присваивается идентификатор повара ie, и они отправляют его. обратно на каждый последующий запрос, отправляемый на сервер для их аутентификации.

Небольшая иллюстрация того, как это будет работать.

flowchart

Если вы посмотрите на обычные заголовки http, вы увидите много метаданных, которые полезны для серверов, чтобы знать, как обрабатывать данные, какие данные ожидает / принимает запрашивающая сторона, на каком языке, что такое куки, и т. Д. c .. Вы можете написать простую вещь, подобную этой, в своем обработчике сокетов, чтобы иметь возможность переводить то, что «хочет» клиент

accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
content-length: 489
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: id=foobar
origin: https://stackoverflow.com

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

...