#java #kotlin #tcp #base64 #outputstream
Вопрос:
Я пытаюсь передать содержимое в кодировке base64 в выходной поток от клиента kotlin по протоколу TCP на сервер python. Когда я читаю на стороне python, у меня нет результата в кодировке base64. Вот код:
private val o = ObjectMapper().disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET)
fun encode(cmdBodyRequest: ClientRequest, output: OutputStream) {
output.write("""{"req":"${cmdBodyRequest.req}","work_def":"""".toByteArray())
val wrappedOutputStream = Base64.getEncoder().wrap(output)
o.writeValue(wrappedOutputStream, mapOf("hello" to "world"))
wrappedOutputStream.close()
output.write(""}".toByteArray())
output.write("n".toByteArray())
}
На стороне сервера python я просто читаю строку из программы чтения потоков. Мой результат выглядит так:
{"req":"549ebd95-41cb-46f1-93fa-dc355f70f16a","work_def":"x00x00x00Ix00x00x00mx00x00x00Ux00x00x00yx00x00x00ax00x00x00Gx00x00x00xx00x00x00ix00x00x00Rx00x00x003x00x00x00hx00x00x002x00x00x00Ux00x00x00Fx00x00x00hx00x00x00kx00x00x00dx00x00x00mx00x00x00Nx00x00x00tx00x00x00ex00x00x00Gx00x00x00tx00x00x00mx00x00x00Ux00x00x00Tx00x00x000x00x00x009"}n'
Моя цель состоит в том, чтобы base64 кодировал work_def, который может быть очень большой вложенной структурой json (я только что использовал mapOf(«привет» миру») для целей тестирования), чтобы предотвратить его декодирование python в дикт, чего я не хочу. Это дорого, и серверу не нужно знать содержимое work_def, ему просто нужно передать запрос другому клиенту. Я также хочу избежать кодирования base64 в памяти на стороне клиента, так как я не хочу использовать дополнительные байты для копии объекта с кодировкой base64. Я хочу, чтобы кодировка base64 выполнялась в выходном потоке, чтобы предотвратить дополнительные накладные расходы.
Любая помощь в том, что я делаю неправильно или как этого можно достичь, была бы очень признательна.
Комментарии:
1. Код, которым вы поделились, работает на меня. Вы пробовали использовать ByteArrayOutputStream для захвата выходных данных и их проверки?
2. Между прочим, остерегайтесь встраивания
cmdBodyRequest.req
непосредственно в ваш JSON, если вы не абсолютно уверены , что он никогда не может содержать кавычку, обратную косую черту или любой другой символ, который сделал бы JSON недействительным. Возможно, вы захотите рассмотреть возможность использования вашего объекта-адаптера для преобразования его в строку JSON и встраивания ее вместо этого.3. Вы на 100% уверены, что именно этот код генерирует этот вывод? Я спрашиваю , потому что строка, которую вы получили, на самом деле
{hello=world}
, но закодирована с помощью base64 дважды и с некоторым дополнительным мусором. Вы уверены, что это не результат тестирования или экспериментов с кодом?