Команды, отправленные со стороны клиента Java, разбиваются на несколько частей перед получением на стороне сервера C ++ - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь отправить команды со стороны клиента, реализованные с помощью Java, на сторону сервера, реализованные с помощью C ++, через TCP-соединение.Код серверной части задан и протестирован, поэтому я вполне уверен, что синтаксический анализ команды не является проблемой.Но когда я пытаюсь отправить команды String со стороны Java, серверная сторона иногда получает несколько пакетов, поэтому она не обрабатывается правильно.Поскольку сервер выполняет команду только тогда, когда она заканчивается символом новой строки, первая часть команды отбрасывается и выдается неизвестная ошибка сообщения.Я использую DataOutputStream для стороны Java и использую DataOutputStream.writeBytes (String s) для написания моей команды и использую BufferedReader для чтения сообщения, возвращаемого сервером.

Я могу проверитьсервер с помощью telnet для подключения к серверу без запуска стороннего кода Java.Из telnet я могу успешно отправлять несколько команд, и они обрабатываются правильно.Однако, когда я пытаюсь отправить команды из Java, они разбиваются на части.Первая команда всегда в порядке, это всегда "add_server 3 \ n", а вторая команда, которая называется "dec_dimmer \ n", разбивается на "d" и "ec_dimmer \ n" и все последующие команды в аналогичномfashion.

Вот как реализована часть команды send:

DataOutputStream outToServer = null;
        try {
            outToServer = new DataOutputStream(mClientSocket.getOutputStream());
        } catch(IOException e) {
            e.printStackTrace();
        }

        try {
            String cmd = command + '\n';
            if(mDebug) {
                System.out.println("Sending Command: " + cmd);
            }
            outToServer.writeBytes(cmd);
        } catch (IOException e) {
            e.printStackTrace();
        }
BufferedReader inFromServer = null;
        try {
            inFromServer = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
        } catch(IOException e) {
            e.printStackTrace();
        }


        String jsonOutput = null;
        try {
            jsonOutput = inFromServer.readLine();
        } catch(IOException e) {
            e.printStackTrace();
        }

        if(mDebug) {
            System.out.println("FROM SERVER: " + jsonOutput);
        }

        return jsonOutput;

Кроме того, точно такой же клиент был реализован ранее в c ++ и работает отлично.Следующая функция - это функция отправки команды из клиентской версии c ++:

std::string SwimClient::sendCommand(const char* command) {
    if (!socket.is_open()) {
        throw std::runtime_error("socket is closed");
    }

    boost::system::error_code ignored_error;
    cout << "sending command = " << command << endl;
    boost::asio::write(socket, boost::asio::buffer(command, strlen(command)),
              boost::asio::transfer_all(), ignored_error);


    vector<char> buffer(128);
    boost::system::error_code error;

    size_t len = socket.read_some(boost::asio::buffer(buffer), error);

    if (error)
        throw boost::system::system_error(error);

    string reply(buffer.data(), len);
    if (reply.compare(0, 6, "error:") == 0) {
        // trim strings
        size_t last = reply.length() - 1;
        while (isspace(reply.at(last))) {
            reply.erase(last--);
        }
        string cmd(command);
        last = cmd.length() - 1;
        while (isspace(cmd.at(last))) {
            cmd.erase(last--);
        }

        throw std::logic_error(reply + "(cmd " + cmd + ')');
    }

    return reply;
}
...