Как избежать блокировки при использовании reader.readLine () и sc.nextLine () - PullRequest
0 голосов
/ 23 октября 2018

Я использую reader.readLine() и sc.nextLine() для имитации сервера и клиента.Однако после того, как я набрал несколько слов в сканере, сервер ничего не ответил.Я думаю, что проблема заключается в блокировке потоков, но я не могу исправить это.Может ли кто-нибудь помочь указать, где находится точка прилипания.

Вот код для сервера.

public class Server {

    public static LocalDateTime currentTime() {
        return LocalDateTime.now();
    }
    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket ss = new ServerSocket(9091);
        System.out.println("TCP server ready.\n");
        Socket sock = ss.accept();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))) {
            try (BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(sock.getOutputStream(), StandardCharsets.UTF_8))) {
                String cmd;
                System.out.println("read in");
                while ((cmd = reader.readLine()) != null) {
                    System.out.println("Rcvd: " + cmd);
                    if ("time".equals(cmd)) {
                        writer.write(currentTime() + "\n");
                        writer.flush();
                    } else {
                        writer.write("Sorry?\n");
                        writer.flush();
                    }   
                }    
            }
        }
        sock.close();
        ss.close();

    }

}

Код для клиента

public class Client {

    public static void main(String[] args) throws IOException, InterruptedException {
        InetAddress addr = InetAddress.getLoopbackAddress();
        try (Socket sock = new Socket(addr, 9091)){
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8))){
                try (BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(sock.getOutputStream(), StandardCharsets.UTF_8))){
                    Scanner sc = new Scanner(System.in);
                    String cmd;
                    while (sc.hasNext()) {
                        cmd = sc.nextLine();
                        System.out.println("Scanned: " + cmd);
                        writer.write(cmd);
                        writer.flush();

                        String resp = reader.readLine();
                        System.out.println("Response: " + resp);
                    }

                }
            }
        }

1 Ответ

0 голосов
/ 23 октября 2018

Используйте это в клиенте:

writer.write(cmd + "\n");

, так как сервер читает строки.

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