Multi-Client Server в Java, возможно потоки не работают должным образом или я не знаю, не могу понять, почему - PullRequest
1 голос
/ 18 июня 2019

Я программирую сервер на Java, который каждую секунду транслирует клиентам функцию Date (). Проблема в том, что он работал только для одного клиента, но как только я начал вносить изменения для поддержки нескольких клиентов, он передает Date () только один раз, а затем останавливается, как будто функция вызывается только один раз. Я не могу найти, что я делаю неправильно, поэтому я просто вставлю код, и, надеюсь, кто-то обнаружит ошибку. Я искал в Интернете, но только в конечном итоге запутался, чем я начал. Для клиентской программы я использую приложение терминала Tellnet для Windows.

public class Server
{
    private ServerSocket SERVER;
    private int PORT;
    private Socket CLIENT;

    public Server()
    {
        PORT = 8818;
        try
        {
            SERVER = new ServerSocket(PORT);
            System.out.println("Server started on port: " + PORT);
        }
        catch(IOException e)
        {
            System.out.println(e.getMessage());
        }
    }

    public void On() throws IOException
    {
        while(true)
        {
            CLIENT = SERVER.accept();
            new ClientHandler(CLIENT).start(); 
        }
    }
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public class ClientHandler extends Thread
{
    private Socket CLIENT;
    private OutputStream out;
    public ClientHandler(Socket CLIENT)
    {
            System.out.println("Accepted Connection from: " + CLIENT.getInetAddress());
            this.CLIENT = CLIENT;
    }

    public void run()
    {
        try
        {
            out = CLIENT.getOutputStream();
            out.write(("Time now is: " + new Date() + "\n").getBytes());
            sleep(1000);
        }
        catch(Exception e) 
        {
            System.out.println(CLIENT.getInetAddress() + " has left the session");
            try
            {
            out.close();
            CLIENT.close();
            }
            catch(IOException j) 
            {
                System.out.println("Unexpected Error");
                System.exit(-1);
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 июня 2019

Ваши модификации почти сработали - ниже - работающая версия с незначительными изменениями в вашем коде.

Частью ваших изменений вы непреднамеренно удалили цикл while в функции run, что означает, что функция Date () фактически вызывается только один раз. Чтобы увидеть это, удалите цикл while из run (), и после того, как Дата напечатана (в окне telnet), появится сообщение «Выполнено с помощью функции run». печатается.

Я добавил идентификатор для каждого клиента, который печатается с датой. Статическое поле класса cnt гарантирует, что у каждого клиента свой идентификатор.

Я запустил отдельные клиенты в отдельных терминалах командной строки, используя telnet localhost 8818 так, чтобы они работали одновременно. Внизу вывод от 3-го клиента.

Я переключил код на соглашение camelCase (переменные начинаются со строчной буквы и пишутся с заглавной буквы для каждого нового слова), поскольку все CAPS обычно зарезервированы для констант, и это изменение облегчило чтение кода для меня.

public class Server
{
    private ServerSocket server;
    private int port;
    private Socket client;

    public Server()
    {
        port = 8818;
        try
        {
            server = new ServerSocket(port);
            System.out.println("Server started on port: " + port);
        }
        catch(IOException e)
        {
            System.out.println(e.getMessage());
        }
    }

    public void on() throws IOException
    {
        while(true)
        {
            client = server.accept();
            new ClientHandler(client).start(); 
        }
    }
}
public class ClientHandler extends Thread {
    private Socket client;
    private OutputStream out;
    private int id;
    private static int cnt=0;

    public ClientHandler(Socket client) {
        System.out.println("Accepted Connection from: " + client.getInetAddress());
        this.client = client;
        id=cnt;
        cnt++;
    }

    public void run() {
        try {
            out = client.getOutputStream();
            while (true) {
                out.write(("Client " + id + ": Time now is: " + new Date() + "\n").getBytes());
                sleep(1000);
            }

        } catch (Exception e) {
            System.out.println(client.getInetAddress() + " has left the session");
            try {
                out.close();
                client.close();
            } catch (IOException j) {
                System.out.println("Unexpected Error");
                System.exit(-1);
            }
        }
        System.out.println("Done with the run function.");

    }
}

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        Server s = new Server();

        s.on();
    }

}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...