Сервер аутентификации сокета? - PullRequest
5 голосов
/ 16 марта 2011

В настоящее время я играю с java, чтобы создать сервер аутентификации для настольного приложения, и до сих пор мне удавалось заставить и клиент, и сервер взаимодействовать как чат-сервер / клиент для начала.

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

Например, это код сервера:

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

public class LoginServer
{
    public static void main(String[] args) throws Exception {
        int port = 7000;
        int id = 1;

        ServerSocket loginserver = null;
        try
        {
            loginserver = new ServerSocket(port);
            System.out.println("LoginServer started...");
        }
        catch (IOException e) {
            System.out.println("Could not listen on port: " + port);
            System.exit(-1);
        }

        while (true)
        {
            Socket clientSocket = loginserver.accept();
            ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
            cliThread.start();
        }
    }
}

class ClientServiceThread extends Thread
{
    Socket clientSocket;
    int clientID = -1;
    boolean running = true;

    ClientServiceThread(Socket s, int i)
    {
        clientSocket = s;
        clientID = i;
    }

    public void run()
    {
        System.out.println("Accepted Client : ID - " + clientID + " : Address - " + clientSocket.getInetAddress().getHostName());
        try
        {
            BufferedReader   in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter   out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
            while (running)
            {
                String clientCommand = in.readLine();
                System.out.println("Client Says :" + clientCommand);
                if (clientCommand.equalsIgnoreCase("quit"))
                {
                    running = false;
                    System.out.print("Stopping client thread for client : " + clientID);
                }
                else
                {
                    out.println(clientCommand);
                    out.flush();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

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

  • Что меня интересует, так это как мне сделать так, чтобы клиент мог подключиться к нему только в том случае, если пользователь и пароль были отправлены?

  • Или я должен всегда получать начальныйсоединение и оттуда получить аутентификационную информацию, и если клиент не отправил ее, скажем, 3 секунды, отключите их?

  • Каков правильный способполучать новые соединения и аутентифицировать пользователей с ним?

1 Ответ

10 голосов
/ 16 марта 2011

У вас есть правильная идея, но вам нужно больше думать о ней как о конечном автомате.

Клиент подключается, затем ему нужно перейти в состояние входа в систему, где вы ожидаете, что оноотправить аутентификационную информацию.Если неверно или истекло время ожидания, отсоедините.

Если правильно, перейдите в состояние обработки команд.Если вы получили команду выхода, либо перейдите в состояние очистки, либо просто отключитесь.

Вот общий план:

String line;
while ((line = in.readLine()) != null) {
    switch (state) {
        case login:
            processLogin(line);
            break;
        case command:
            processCommand(line);
            break;
    }
}

Ваша processLogin функция может выглядеть следующим образом:

void processLogin(String line) {
    if (user == null) {
        user = line;
    }
    else if (password == null) {
        password = line;
    }
    else {
        if (validUser(user, password)) {
            state = command;
        }
        else {
            socket.close();
        }
    }
}

И ваша processCommand функция:

void processCommand(String line) {
    if (line.equals(...)) {
        // Process each command like this
    }
    else if (line.equals("quit")) {
        socket.close();
    }
    else {
        System.err.println("Unrecognized command: " + line);
    }
}

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

...