Метод BufferedReader readLine зависает и блокирует программу - PullRequest
2 голосов
/ 22 октября 2011

Я пытаюсь изучить сокеты, используя Java, и успешно отправил данные на ServerSocket, работающий на моем собственном компьютере. Когда я пытаюсь читать из этого сокета, используя readline (чтобы я мог просто повторить свое собственное отправленное сообщение), моя программа зависает и не возвращается.

Вот код:

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

    TCPClient cli = new TCPClient("127.0.0.1", "15000");
    try {
        cli.ostream.writeUTF("Teste");
        String echo = cli.istream.readLine(); //it hangs in this line
        System.out.println(echo);
    }

TCPClient - это класс, который я определил, поэтому я могу протестировать свою программу на более простом интерфейсе, прежде чем использовать Swing на своей рабочей станции. вот код:

public class TCPClient {

public DataOutputStream ostream = null;
public BufferedReader istream = null;

public TCPClient(String host, String port) throws UnknownHostException {
    InetAddress ip = InetAddress.getByName(host);

    try {
        Socket socket = new Socket(host, Integer.parseInt(port));

        ostream = new DataOutputStream(socket.getOutputStream());
        istream = new BufferedReader(new InputStreamReader(socket.getInputStream()));


    } catch (IOException ex) {
        Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
    }

}

Мой сервер довольно прост. После того, как соединение установлено, оно входит в этот цикл и остается здесь, пока я не закрою клиент (из-за бесконечного цикла). После этого некоторая обработка исключений возвращает его в точку до начала соединения.

            while(true){
                String msg = istream.readLine();
                System.out.println("Arrived on server: " + msg); //just works on debug
                ostream.writeUTF("ACK: " + msg);
                ostream.flush();
            }

Я не вижу, что мне не хватает.

PS: странная штука в том, что если я отлаживаю сервер, я вижу прибывающее туда сообщение (например, могу его распечатать), но это невозможно, если я просто запускаю этот код. Имеет ли это отношение к параллелизму, которое я пропускаю?

ТНХ

Ответы [ 3 ]

11 голосов
/ 22 октября 2011

Проблема в том, что readLine пытается прочитать строку. Он не вернет строку, пока не будет уверен, что конец строки достигнут. Это означает, что он ожидает либо символ новой строки, либо конец сообщения. Поскольку сервер не отправляет символ новой строки и не закрывает поток, клиент ждет бесконечно.

1 голос
/ 22 октября 2011

writeUTF () не записывает строку.Смотрите Javadoc.writeUTF () предназначен для использования с readUTF ().И читатели для использования с писателями.Поэтому измените DataOutputStream на BufferedWriter и вызовите write (), а затем newline ().

1 голос
/ 22 октября 2011
cli.ostream.writeUTF("Teste");

Разве это не должно содержать новую строку? В противном случае метод чтения будет ждать новой строки, я думаю.

Также, как предложено, вы можете попробовать очистить ostream после записи в него.

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