Сокеты. Прием от сервера массива данных

201
14 июля 2019, 01:20

Имеется сервер который слушает команды от подключившихся клиентов. При обработке команды(запросов) клиенту отправляется массив данных. Проблема с приемам массива данных, после вывода данных сервера в цикле клиент зависает и дальше не идет по коду. Использовал для приема и передачи пакетов сокета: BufferedReader(new InputStreamReader(socket.getInputStream())); и PrintStream(socket.getOutputStream());

Answer 1

Есть похожие вопросы: тут и тут

Ну а по-существу - это вопрос, как вы читаете данные от сервера на клиенте и делает ли сервер flush для PrintStream'a.

Так работает:

Сервер

public class ServerExample implements Runnable {
    Socket clientSocket;
    public ServerExample(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }
    public void run() {
        try {
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(),true);
            BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            System.out.println("Accepted connection from " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
            writer.println("Waiting for commands from client");
            writer.println("Supported commands:");
            writer.println("  GET");
            writer.println("  CLOSE");
            writer.println();
            while (clientSocket.isConnected()) {
                System.out.println("waiting for command...");
                String line = reader.readLine();
                System.out.println("command: " + line);
                if ("close".equalsIgnoreCase(line) || (null == line)) {
                    System.out.println("Closing connection with " + clientSocket.getInetAddress() + ":" + clientSocket.getPort());
                    writer.println("server is closing connection");
                    break;
                } else if ("get".equalsIgnoreCase(line)) {
                    System.out.println("sending data to client...");
                    // отправляем "массив" чисел клиенту
                    IntStream.range(1, 5).forEach(writer::println);
                }
            }
            reader.close();
            writer.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private final static int SERVER_PORT = 9876;
    public static void main(String [] args) throws IOException {
        try (ServerSocket serverSocket = new ServerSocket(SERVER_PORT)) {
            System.out.println("Server is listening on 127.0.0.1:" + SERVER_PORT);
            while (true) {
                Socket socket = serverSocket.accept();
                new Thread(new ServerExample(socket)).start();
            }
        }
    }
}

Клиент

public class ClientExample {
    private final static int SERVER_PORT = 9876;
    public static void readSocket(BufferedReader reader) throws IOException, InterruptedException {
        Thread.sleep(10); // Чтобы сервер успел прислать данные и reader.ready() вернул true
        while(reader.ready())
            System.out.println(reader.readLine());
    }
    public static void main(String [] args) throws IOException, ClassNotFoundException, InterruptedException {
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = new Socket(host.getHostName(), SERVER_PORT);
        PrintWriter writer    = new PrintWriter(socket.getOutputStream(),true);
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        readSocket(reader);
        System.out.println("\n1st call to GET command");
        writer.println("GET");
        readSocket(reader);
        System.out.println("\n2nd call to GET command");
        writer.println("GET");
        readSocket(reader);
        System.out.println("\ncall to CLOSE command");
        writer.println("CLOSE");
        readSocket(reader);
    }
}
READ ALSO
Добавить пункт в контекстное меню

Добавить пункт в контекстное меню

Возможно этот вопрос уже задавался, но я его так и не нашелКак добавить пункт в "глобальное" контекстное меню

188
приложение на javafx не отвечает

приложение на javafx не отвечает

Пишу прогу на java и графический интерфейс для нее на javafx все было хорошоНо в один момент начала выскакивать ошибка java tm platform se binary не отвечает

142
Проблема со сборкой ear архива с помощью Maven

Проблема со сборкой ear архива с помощью Maven

Создал заготовку под разработку Enterprise приложенияВ качестве сборщика приложения использую Maven

161
Тень поверх фонового изображения CSS

Тень поверх фонового изображения CSS

Доброе время суток всемВопрос такой - как сделать тень поверх фонового изображения другого элемента? Есть элемент, у которого есть тень box-shadow,...

193