Нерегулярный вывод на второй проход в Java - PullRequest
0 голосов
/ 19 марта 2012

Пользователь выбирает опцию, в данном случае опцию 1 - Заваривать.Затем они вводят URL, в данном случае BREW.Сейчас я проверяю только слово BREW, поэтому кофе: // 127 ... на данном этапе не имеет значения.

Ответ на сообщение получен обратно с сервера.Обратите внимание на сообщение 200 OK, отправленное в первом ответном сообщении сервера.

Приложение продолжает цикл, когда пользователь снова вводит URL-адрес, снова это BREW.

На этот раз проблема в том, что возвращается сообщение 400 Bad Request.Поскольку URL-адрес правильный, они должны получить 200 OK, как при первом прохождении приложения.

Клиентская консоль:

WELCOME TO THE COFFEE POT APPLICATION!

Select an option:
1. Brew
2. Quit
1
Enter URL (e.g. BREW coffee://127.0.0.1/pot-1 HTCPCP-new )
BREW

MESSAGE FROM SERVER:
    Message: BREW Accept-Additions: *, *, *, *, *, *, *, 
    HTCPCP-new 200 OK BREW START command completed.
    Content-length:  44
    Content-type: application/octet-stream
    @@

Select an option:
1. Brew
2. Quit
1
Enter URL (e.g. BREW coffee://127.0.0.1/pot-1 HTCPCP-new )
BREW

MESSAGE FROM SERVER:
    Message: BREW Accept-Additions: *, *, *, *, *, *, *,  
    HTCPCP-new 400 Bad Request.
    Content-length:  5
    Content-type: application/octet-stream
    @@

Select an option:
1. Brew
2. Quit

Обработчик клиентских потоков:

import java.io.*;
import java.net.*;
import javax.activation.MimetypesFileTypeMap;

public class HTCPCPClientWorker extends Thread {

    Socket cwsocket = null;

    public HTCPCPClientWorker(Socket cwsocket) {
        super("ClientWorker");
        this.cwsocket = cwsocket;
    }

    @Override
    public void run() {

        String clientSentence = null;
        BufferedReader inFromClient = null;
        PrintWriter outToClient = null;

        try {
            inFromClient = new BufferedReader(new InputStreamReader(cwsocket.getInputStream()));
            outToClient = new PrintWriter(cwsocket.getOutputStream(), true);
        } catch (IOException ex) {
            System.err.println("Cannot create streams");
        }

        try {

            do { // end when client says QUIT

                StringBuffer clientInputLine[] = new StringBuffer[3];

                clientInputLine[0] = new StringBuffer();
                clientInputLine[1] = new StringBuffer();

                // Get next message from client 
                for (int i = 0; i <= clientInputLine.length; i++) {

                    // read input line from BufferedReader 
                    clientSentence = inFromClient.readLine();

                    if (clientSentence.contains("BREW")) {
                        outToClient.println("Message: " + clientSentence);
                        outToClient.println("HTCPCP-new 200 OK BREW START command completed.");
                        outToClient.println("Content-length:  " + clientSentence.length()); // length needs to correspond to above line 
                        outToClient.println("Content-type: " + new MimetypesFileTypeMap().getContentType(clientSentence));
                        outToClient.println("@@");
                        outToClient.flush();
                    } else {
                        outToClient.println("Message: " + clientSentence);
                        outToClient.println("HTCPCP-new 400 Bad Request.");
                        outToClient.println("Content-length:  " + clientSentence.length()); // length needs to correspond to above line 
                        outToClient.println("Content-type: " + new MimetypesFileTypeMap().getContentType(clientSentence));
                        outToClient.println("@@");
                        outToClient.flush();
                    }

                    // wait for EOF = @@ 
                    System.out.println("\tInput: " + clientSentence);
                    if (clientSentence.equals("@@") == true) {
                        break;
                    }
                    clientInputLine[i].append(clientSentence);
                } // end for loop


            } while (!clientSentence.contains("QUIT"));

            outToClient.println("GOODBYE!");
            outToClient.flush();

            System.out.println("\tClient has disconnected.");
            cwsocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    } // end run

} // end HTCPCPClientWorker.java

Я думал, что проблема будет устранена путем воссоздания StringBuffer на каждом проходе, но это не такпохоже, дело в этом.

3-й проход и далее, кажется, функционируют правильно.

Есть мысли?

1 Ответ

0 голосов
/ 19 марта 2012

Полагаю, вам следует пересоздавать BufferedReader (inFromClient) каждый раз, когда вы хотите читать из сокета.BufferedReader становится пустым после того, как вы используете readLine, поэтому при следующем вводе ввода в сокет он не будет читать его.

Более подробная информация о чтении и записи в сокеты здесь .

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