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();
}
}
}