Отправка и получение информации между сокетами и ServerSockets - PullRequest
0 голосов
/ 14 декабря 2011

Следующий код должен получить время из сокета, добавить к нему 6 месяцев и вернуть его в сокет. Вот код, который инициализирует сокеты и серверы:

    //open and connect the sockets
    ServerSocket ss = new ServerSocket(4444);
    System.out.println("1");
    Socket sock = new Socket(ss.getInetAddress(),4444);
    System.out.println("2");
    Socket srv = ss.accept();
    System.out.println("3");

Вот код, который показывает серверу, получающему время и добавляющему к нему 6 месяцев (формат времени: ГГГГММДДЧЧММСС).

    //send/receive and increment the current time by 6 months
    PrintWriter bw = new PrintWriter(sock.getOutputStream());
    System.out.println("4");
    bw.print(rtime);
    System.out.println("5");
    //add 6 months to the current time
    long ret = Long.valueOf(new BufferedReader(new InputStreamReader(srv.getInputStream())).readLine()) + 600000000;
    System.out.println("6");

Переменная rtime, это long, которая уже объявлена. Код находится в пределах try{}, за которым следует

    catch(Exception e) {
      System.out.println(e);
      System.exit(-1);
    }

Я поместил строки печати в код, чтобы увидеть, где происходит ошибка, так как по какой-то причине программа завершает работу без вывода ошибки. Все номера печатаются до «6». Другими словами, ошибка встречается в строке .readline(). Я не знаю, что я делаю не так. Любая помощь очень ценится, спасибо.

1 Ответ

1 голос
/ 14 декабря 2011

Пожалуйста, добавьте

bw.flush();

после

bw.print(rtime);

Это необходимо для очистки содержимого из потока вывода клиентских сокетов, который будетзатем будет доступен при вводе сокета сервера.

В противном случае, в вашем примере readline ();не выйдет, так как это блокирующий вызов.

...