BufferedReader.readLine () из сокета в Java застрял - PullRequest
1 голос
/ 18 ноября 2011

Я постараюсь объяснить мою проблему подробно.Не стесняйтесь спрашивать, если вам нужна дополнительная информация.

У меня есть соединение мульти-клиент / сервер с использованием Java-сокетов.Все биржи работают в соответствии с протоколом в каждом отдельном случае.Метод searchFlight (destination, date) запрашивает базу данных SQL (извините, я не могу ее предоставить) и возвращает переменную ResultSet.И затем метод displaySelected (ResultSet) отправляет ResultSet в виде строки клиентской строке построчно.

Связь работает хорошо, пока сервер не отправит клиенту «час».Я проверил значения на сервере, и оказалось, что сервер отправляет правильную строку клиенту (которая должна быть «Полетный час (ЧЧ: ММ):»), но клиент печатает только предыдущую.Конкретно, это застряло так:

(1) Make reservation | (2) Cancel reservation
1
Choose the departure date (YYYY-MM-DD):
2012-01-01
(1) Go to Encampment | (2) Go to City:
2
+------|-----------|------------|-------------|----------|-------+  
| Code | Company   | Dest       | Date        | Hour     | Seats |  
+------+-----------+------------+-------------+----------+-------+  
| AER2 | Aerocamp  | City       | 2012-01-01  | 07:00:00 | 5 /6  |  
| COP2 | CopterFly | City       | 2012-01-01  | 09:00:00 | 5 /6  |  
| AER1 | Aerocamp  | City       | 2012-01-01  | 10:00:00 | 3 /6  |  
| H001 | HeliAir   | City       | 2012-01-01  | 11:00:00 | 6 /6  |  
| COP1 | CopterFly | City       | 2012-01-01  | 11:00:00 | 6 /6  |  
| AER2 | Aerocamp  | City       | 2012-01-01  | 13:00:00 | 4 /6  |  
| COP2 | CopterFly | City       | 2012-01-01  | 15:00:00 | 2 /6  |  
| AER1 | Aerocamp  | City       | 2012-01-01  | 16:00:00 | 6 /6  |  
| COP1 | CopterFly | City       | 2012-01-01  | 17:00:00 | 2 /6  |  
| COP3 | CopterFly | City       | 2012-01-01  | 20:00:00 | 3 /6  |  
+------|-----------|------------|-------------|----------|-------+  
Flight code (XXX#):
AER1
Flight code (XXX#):

Flight code (XXX#):

Я застрял с этой проблемой в течение нескольких дней, и я действительно не знаю, как ее исправить.Я перепробовал много альтернатив без успеха.Я надеюсь, что кто-то более опытный с Java, чем я, мог бы помочь мне.

Заранее спасибо.

Вы можете увидеть весь мой код ниже.


СТОРОНА КЛИЕНТА

public class Client {

static Socket clientSocket = null;

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

        PrintWriter out = null;
        BufferedReader in = null;

        try {
            clientSocket = new Socket("localhost", 1024);
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        } catch (UnknownHostException e) {
            System.err.println("Don't know about host:");
            System.exit(1);

        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromClient = null;

        try {
            while (((fromServer = in.readLine()) != null)) {

                System.out.println(fromServer);
                System.out.flush();     

                if(!fromServer.endsWith("  ")){
                    fromClient = stdIn.readLine();
                }

                if (fromClient != null) {
                    out.println(fromClient);
                    out.flush();
                }
                }

            out.close();
            in.close();
            stdIn.close();
            clientSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1 Ответ

1 голос
/ 19 ноября 2011

Вот проблема. На клиенте, когда вы читаете список рейсов / расписаний, для каждой строки отображаются только данные, которые вы читаете с сервера, вы отправляете предыдущий ввод, который пользователь ввел на сервер. По этой причине он продолжает печатать City, потому что клиент продолжает отправлять 2, собранные для опции encampment or city.

Заменить

if(!fromServer.endsWith("  ")){
    fromClient = stdIn.readLine();
} 

с

if(!fromServer.endsWith("  ")){
    fromClient = stdIn.readLine();
} else {
    // Data from the server is for display only. No input is required.
    // Clear out previous input.
    fromClient = null;
} 

Кроме этого, вам нужно обработать ввод Hour в вашем Protocol.process(..)

...