Специальная кодировка символов в моем простом Java HTTPServer - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть простое Java-приложение, в основном сервер, реализованный с использованием com.sun.net.HttpServer API, который читает файл и просто отправляет обратно тексты после некоторой обработки.Серверная часть выглядит просто так:

        server = HttpServer.create(new InetSocketAddress(serverPort), 0);
        logger.info("EventRetriever REST server listening to port: " + serverPort);
        server.createContext("/getEvents", new MedatadaHandler());
        server.setExecutor(null);
        server.start();
// ...
@Override
        public void handle(HttpExchange he) throws IOException {
        //...
        String response = requestEvents();
        he.sendResponseHeaders(200, response.length());
        OutputStream os = he.getResponseBody();
        os.write(response.toString().getBytes());
        os.close();
}
//...
public String requestEvents(){
//...
// this printing on the console looks fine though:
        logger.info(jsonString);
        return jsonString;
}

Я запускаю свой jar файл с java -jar myApp.jar в командной строке или просто в своей IDE.Я наблюдаю некоторые странные поведения, иногда просто зависания, когда требуется отправка текстов, содержащих специальные символы, такие как музыкальный символ .Когда я вызываю IP:PORT/getEvent через браузер, поведение становится таким странным:

Если я запускаю его в Windows Powershell или в командной строке, на консоли появляется символ ?, и я получаюиз браузера также отображается как ?.Но когда я запускаю программу на linux-сервере или в моей Eclipse IDE, она правильно отображается на консоли (как ), но в браузере я получаю следующую ошибку, хотя статус 200 OK.Я вижу на консоли, что Java-приложение продолжает зацикливать печать строки каждые несколько секунд (как будто оно пытается отправить данные, но не может что-то блокировать!).Но я не получаю никаких исключений или ошибок в приложении (я регистрирую все возможные ошибки).

enter image description here

Я очень запутался в этом поведении,Что происходит?!

Во-первых, почему то, что я получаю, зависит от среды, в которой я запускаю свое Java-приложение ?!Если командная строка Windows / Powershell показывает символ как ?, я ожидаю, что он будет отображаться локально, как этот.Почему я должен видеть это также как ? в моем браузере ?!Приложение Java должно быть независимым от среды.

И, во-вторых, что происходит с этой ошибкой в ​​среде Linux / Eclipse при запросе строки с этим символом?

1 Ответ

0 голосов
/ 15 марта 2019

Проблема, как можно было предсказать, была связана с getBytes() и UTF-8 строковыми представлениями.Сделал следующее и тогда все было хорошо:

        he.sendResponseHeaders(200, response.getBytes("UTF-8").length);
        OutputStream os = he.getResponseBody();
        os.write(response.getBytes("UTF-8"));
...