Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > SocketServer. Передача информации нескольким клиен


Автор: Michael.de 26.6.2023, 14:46
У меня есть вопрос, который появился из-за изменения задачи, описанной в >>https://forum.vingrad.ru/topic-396955.html<<

Запускается Socket-сервер. Он генерирует default.ini с некоторыми параметрами, в том числе и со своим IP. Этот сгенерированный файл переносится на несколько клиентов, которые затем также запускаются. Клиенты есть двух типов: Recorder (считывает состояние камер и пересылает информацию на сервер) и Display (получает информацию от сервера и отображает её). Клиентов каждого типа может быть несколько.

Изначально было всего один сервер и один клиент. Клиент считывал состояния камер, пересылал всё серверу, который всё отображал. И всё прекрасно работало, пока было всего 1 соединение... а сейчас их несколько.

Я набросал рабочий пример, но остаётся проблема, что я могу с сервера ответить клиенту, передавшему ему информацию... а как мне переслать её другим клиентам?

Код

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
//import java.util.ArrayList;

class RecorderDisplayServer {

    public static void main(String[] args) throws IOException {

//        ArrayList <ClientThread> list = new ArrayList <ClientThread>();
        try (ServerSocket server = new ServerSocket(8888)) {
            int counter = 0;
            System.out.println("Server Started...");

            while (true) {
                counter++;
                Socket serverClient = server.accept();
                System.out.println(" >> " + "Client No:" + counter + " started!");
                ClientThread st = new ClientThread(serverClient, counter);
//                list.add(sct); // а дальше? :)
                st.run();
            }
        }
    }
}

Код

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

class RecorderDisplayClient {

    public static void main(String[] args) throws IOException {

        String ip                      = "10.100.100.50"; // ip сервера
        Socket           socket        = new Socket(ip, 8888);
        DataInputStream  inStream      = new DataInputStream(socket.getInputStream());
        DataOutputStream outStream     = new DataOutputStream(socket.getOutputStream());
        BufferedReader   br            = new BufferedReader(new InputStreamReader(System.in));
        String           clientMessage = "";
        String           serverMessage = "";

        while(!clientMessage.equals("bye")) {
            System.out.print("Your message: ");
            clientMessage = br.readLine();
            outStream.writeUTF(clientMessage);
            outStream.flush();
            serverMessage=inStream.readUTF();
            System.out.println(serverMessage);
        }

        outStream.close();
        outStream.close();
        socket.close();
    }
}

Код

import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

class ClientThread implements Runnable {

    private Socket serverClient;
    private int    clientNumber;

    ClientThread(Socket inSocket, int counter) {
        serverClient = inSocket;
        clientNumber = counter;
    }

    public void run() {
        try {
            DataInputStream  inStream      = new DataInputStream(serverClient.getInputStream());
            DataOutputStream outStream     = new DataOutputStream(serverClient.getOutputStream());
            String           clientMessage = "";
            String           serverMessage = "";
            while (!clientMessage.equals("exit")) {
                clientMessage = inStream.readUTF();
                serverMessage = "From Server to Client-" + clientNumber +": you've sent a message \""+ clientMessage + "\"";
                System.out.println("From Client-" + clientNumber+ ": message \"" + clientMessage + "\" received :");
                outStream.writeUTF(serverMessage);
                outStream.flush();
            }
            inStream.close();
            outStream.close();
            serverClient.close();
        }
        catch(IOException e) { e.printStackTrace(); }
        finally { System.out.println("Client -" + clientNumber + " exit!"); }
    }
}

Автор: LSD 26.6.2023, 23:38
  • Это дичайшее велосипедостроение и сейчас так писать не принято.
  • Цитата(Michael.de @  26.6.2023,  15:46 Найти цитируемый пост)
    как мне переслать её другим клиентам?

    Естественно через сервер. В данном случае клиент соединяется с сервером, слушает сообщения сервера и шлет серверу свои. Вот https://www.codejava.net/java-se/networking/how-to-create-a-chat-console-application-in-java-using-socket.




Автор: Michael.de 27.6.2023, 09:43
LSD, возможно. Я уже лет 10 как системным администратором работаю и мои Java знания остались на уровне 7-8 версии. За пример спасибо, буду разбираться smile

Автор: SVN74 9.7.2023, 21:55
ClientThread st = new ClientThread(serverClient, counter);
//                list.add(sct); // а дальше? smile
                st.run();
надо в Thread запускать:
Thread t = new Thread(new ClientThread(serverClient, counter));
t.start();

Добавлено через 3 минуты и 14 секунд
try {
            DataInputStream  inStream      = new DataInputStream(serverClient.getInputStream());
            DataOutputStream outStream     = new DataOutputStream(serverClient.getOutputStream());
            String           clientMessage = "";
            String           serverMessage = "";
            while (!clientMessage.equals("exit")) {
                clientMessage = inStream.readUTF();
                serverMessage = "From Server to Client-" + clientNumber +": you've sent a message \""+ clientMessage + "\"";
                System.out.println("From Client-" + clientNumber+ ": message \"" + clientMessage + "\" received :");
                outStream.writeUTF(serverMessage);
                outStream.flush();
            }
            inStream.close();
            outStream.close();
            serverClient.close();
        }
        catch(IOException e) { e.printStackTrace(); }
        finally { System.out.println("Client -" + clientNumber + " exit!"); }
    }
--
Используйте try с ресурсами, - могут не закрыться потоки...

Добавлено через 7 минут и 15 секунд
DataInputStream  inStream      = new DataInputStream(serverClient.getInputStream());
            DataOutputStream outStream     = new DataOutputStream(serverClient.getOutputStream());
-> 
catch(IOException e) { e.printStackTrace(); 
-----
ДатаСтримы могут возвращать конец связи как ошибку, - надо обрабатывать и EOFException ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)