Почему я не могу отправить текст через этот сокет?

1

Это код для Сервера, который у меня есть:

public class XXServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(4545);
        while (true) {
            Thread newThread = new Thread(new XXServerRunner(serverSocket.accept()));
            newThread.start();
        }
    }
}

И у меня будет отдельный поток для каждого приемного сокета:

public class XXServerRunner implements Runnable {
    Socket socket;
    public XXServerRunner(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String readLine = bufferedReader.readLine();
                if(readLine!=null) {
                    System.out.println(readLine);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

И вот как я запускаю Клиент:

public class XXClient {

    Socket socket;
    PrintWriter printWriter;

    public static void main(String[] args) throws IOException {
        XXClient xxClient = new XXClient();
        xxClient.setSocket(new Socket("localhost",4545));
        XXClientDataSender xxClientDataSender = new XXClientDataSender(xxClient);
        Thread xxClientDataSenderThread = new Thread(xxClientDataSender);
        xxClientDataSenderThread.start();
    }

    public PrintWriter getPrintWriter() {
        return printWriter;
    }

    public void setSocket(Socket socket) throws IOException {
        this.socket = socket;
        this.printWriter = new PrintWriter(socket.getOutputStream());
    }

    public void sendText(String stringToBeSent) {
        printWriter.write(stringToBeSent);
        printWriter.flush();
    }
}

То, что я хочу достичь, также представляет собой отдельный поток для отправки текстов, поэтому у меня есть следующее:

public class XXClientDataSender implements Runnable {
    XXClient xxClient;
    Scanner scanner = new Scanner(System.in);
    public XXClientDataSender(XXClient xxClient) {
        this.xxClient = xxClient;
    }
    @Override
    public void run() {
        while (true) {
            String stringToBeSent = scanner.nextLine();
            xxClient.sendText(stringToBeSent);
        }
    }
}

Что происходит, когда я запускаю свой код, я набираю текст в консоли и нажимаю Enter несколько раз, и я не вижу ничего в консоли, где я запускаю ServerSocket. Однако, когда я прекращаю выполнение основного метода клиента ( этот процесс Java я имею в виду, когда я убиваю Java-процесс для Клиента), в консоли сервера я вижу, что теперь весь текст просматривается. Почему это так?

Если то, что я говорю, непонятно, это так: Start Server Start Client Введите текст, нажмите enter.. Nothing Введите текст, нажмите enter.. Nothing Процесс Kill для клиента. Теперь весь текст теперь считывается сервером.

Зачем?

И я также получаю это исключение после того, как я убил процесс для Клиента:

Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1585)
    at XXClientDataSender.run(XXClientDataSender.java:20)
at java.lang.Thread.run(Thread.java:745)
  • 0
    Потому что у вас есть буферизация при чтении из сокета на сервере?
  • 0
    @jcaron Не думаю, что в этом причина. Независимо от того, как долго текст я отправляю, он все равно не виден.
Показать ещё 12 комментариев
Теги:
multithreading
sockets

1 ответ

4
Лучший ответ

Записывайте символ новой строки в код клиента каждый раз, когда вы отправляете.

Вы используете BufferedReader#readLine() который ожидает новый символ строки или конец потока.

  • 0
    Спасибо, работает .. Отличный ответ. Почему это работает, когда я убиваю процесс?
  • 0
    @ Koray Поскольку поток закрывается, читатель обнаруживает это и возвращает.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню