BufferedReader/BufferedWriter не получается прочитать

Пыталась сделать что-то типа онлайн магазина, но есть проблемный участок кода:

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    private static Socket socket;
    private static Scanner scanner;
    private static BufferedReader reader;
    private static BufferedWriter writer;

    public static void main(String[] args) {

        scanner = new Scanner(System.in);

        try {

            socket = new Socket("localhost", 8080);

            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            while (true) {

                if (reader.ready()) {
                    reader.lines().forEach(System.out::println);
                }
                
                String answer = scanner.nextLine();
                writer.write(answer);
                writer.flush();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//--------------------------------

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Stream;

public class Server {

    private final static int PORT = 8080;
    private final static List<Order> orders = new CopyOnWriteArrayList<>();
    //private final static List<SubServer> servers = new CopyOnWriteArrayList<>();
    private final static ExecutorService executorService = Executors.newCachedThreadPool();

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

        ProductDao productDao = new ProductDaoImpl();

        OrderExecutor orderExecutor = new OrderExecutor(orders);
        FinalExecutor finalExecutor = new FinalExecutor(orders);

        Stream.of(orderExecutor, finalExecutor).forEach(executorService::execute);

        ServerSocket serverSocket = new ServerSocket(PORT);

        while (true) {

            Socket socket = serverSocket.accept();

            try {

                SubServer subServer = new SubServer(orders, socket, productDao);
                //servers.add(new SubServer(orders, socket, productDao));
                executorService.execute(subServer);

            } catch (IOException e) {
                socket.close();
            }
//            finally {
//                socket.close();
//            }
        }

    }
}

//---------------------------------------

public class SubServer implements Runnable {

    private final List<Order> orderList;
    private final ProductDao productDao;
    private final BufferedReader in;
    private final BufferedWriter out;

    public SubServer(List<Order> orderList, Socket client, ProductDao productDao) throws IOException {

        this.orderList = orderList;
        this.productDao = productDao;

        this.in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        this.out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

    }

    @SneakyThrows
    @Override
    public void run() {

        log.info("Sub server executed!");

        String answer;

        while (true) {
            out.write("Would you like to make an order? (Yes/No fingerprint)");
            out.flush();

            log.info("sub server write!");

            answer = in.readLine();
            log.info("client answer: {}", answer);

            if (answer.equalsIgnoreCase("no")) {
                break;
            }

            Order order = new Order();
            printProducts();

            out.write("Nice! Please, enter product ID to add it to your bucket");
            out.flush();

            while (true) {

                long id = Long.parseLong(in.readLine().trim());

                if (id == 0) {
                    break;
                }

                Product product = productDao.findById(id);

                if (product != null) order.addProduct(product);

                out.write("Would you like to add one more product?\n" +
                        "1. Enter product ID to add product with this ID\n" +
                        "2. Enter 0 (zero) to exit\n");
                out.flush();

            }

            out.write("Nice! Your order: \n");
            out.write(order.toString() + "\n");
            out.flush();

            orderList.add(order);

        }

Ни прочитать, ни записать, ни с одной, ни с другой стороны корректно не выходит - сообщения не приходят серверу, и клиенту от сервера сообщения так же не приходят. Что я делаю не так?

Я понимаю, что что-то не так с bufferedReader/writer, но не понимаю, что именно


Ответы (1 шт):

Автор решения: Alexandr

Попробуйте добавить вызов метода java.io.BufferedWriter#newLine между java.io.Writer#write(java.lang.String) и java.io.BufferedWriter#flush:

String answer = scanner.nextLine();
writer.write(answer);
writer.newLine();
writer.flush();

Либо использовать java.io.PrintWriter:

package com.somepackage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    private static Socket socket;
    private static Scanner scanner;
    private static BufferedReader reader;
    private static PrintWriter writer;

    public static void main(String[] args) {
        scanner = new Scanner(System.in);

        try {

            socket = new Socket("localhost", 8080);

            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(
                    socket.getOutputStream(), true);

            while (true) {
                String answer = scanner.nextLine();
                writer.println(answer);
                reader.lines().forEach(System.out::println);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
→ Ссылка