Не удается получить заголовок онлайн-потока ShoutCast - PullRequest
1 голос
/ 06 апреля 2020

Я работаю в течение 24 часов, чтобы найти проблему с этим онлайн-потоком: http://str45.streamakaci.com: 8014 Вы можете попробовать это, и оно работает, но когда я пытаюсь получить заголовок из него, используя Java я получаю это:

Sending 'GET' request to URL : http://str45.streamakaci.com:8014
Response Code : -1
Response Message : {Content-type=[unknown/unknown]}

Когда я использую SMSSniffer, чтобы увидеть, что происходит с возвращаемыми HTTP-заголовками, они верны, и я получаю это

GET / HTTP/1.1
Content-Type: text/html; charset=UTF-8
Icy-MetaData: 1
Accept-Encoding: gzip
Content-Encoding: gzip, deflate
Cache-Control: no-cache
User-Agent: Java/1.8.0_131
Host: str45.streamakaci.com:8014
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive


ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-name:Radio Flemme MP3
icy-genre:Various
icy-url:http://www.radioflemme.com
content-type:audio/mpeg
icy-pub:0
icy-metaint:32768
icy-br:128 

с длинным текстом под заголовками.

вот код Java для получения заголовка HTTP, который отлично работает с другим потоком ShoutCast, но не с этим.

 private static void sendGet() throws Exception {

            String url = "http://str45.streamakaci.com:8014";

            HttpURLConnection httpClient =
                    (HttpURLConnection) new URL(url).openConnection();

            // optional default is GET
             httpClient.setRequestMethod("GET");

            //add request header
             httpClient.setRequestProperty("Content-Type", "text/html; charset=UTF-8");

            httpClient.setRequestProperty("Icy-MetaData", "1");
            httpClient.setRequestProperty("Accept-Encoding", "gzip");
            httpClient.setRequestProperty("Content-Encoding", "gzip, deflate");
            httpClient.setRequestProperty("Cache-Control", "no-cache");
           int responseCode = httpClient.getResponseCode();
            System.out.println("\nSending 'GET' request to URL : " + url);
           System.out.println("Response Code : " + responseCode);

            String name = httpClient.getHeaderField("icy-metaint");
           // System.out.println("Response name : " + name);
            System.out.println("Response Message : " +  httpClient.getHeaderFields());

        }

Пожалуйста, кто-нибудь может помочь мне решить эту проблему. Привет

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Похоже, ваш HTTP-клиент не совместим со строкой состояния ответа:

ICY 200 OK

Для обычного HTTP-соединения этот ответ выглядит примерно так: HTTP/1.0 200 OK. Старые клиенты поддерживали это и рассматривали соединение как HTTP 1.0 или 0.9, но где-то по пути мы постоянно теряли эту возможность.

В идеале вы заменяете этот сервер чем-то современным. Icecast является заменой для вас, а также поддерживает HTTPS. Существуют более новые версии SHOUTcast DNAS, но HTTPS - это хлопот и дополнительные лицензионные требования, поэтому я даже не беспокоюсь об этом в наши дни. И, конечно, вы также можете go HLS и вообще не нуждаться в специализированном потоковом сервере. (Просто поймите компромисс с точки зрения совместимости и задержки.)

Если вы не контролируете сервер, вам нужно как-то переопределить ваш HTTP-клиент, чтобы он мог принять, что ICY - Стиль строки состояния. Если вы не можете этого сделать, вы застряли, установив обычное TCP-соединение и самостоятельно проанализировав ответ.

0 голосов
/ 07 апреля 2020

URL http://str45.streamakaci.com: 8014 действительно возвращает заголовок, вот команда для проверки заголовков в вашем терминале с использованием lynx:

lynx -mime_header http://str45.streamakaci.com:8014
HTTP/1.0 200 OK
content-type:text/html

<HTML><HEAD><meta http-equiv="Content-Language" content="en-us"><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><meta http-equiv="Pragma" content="no-cache">.... HTML follows

Это не на 100% ясно то, что вы ищете, так что на всякий случай упомяну, что http://str45.streamakaci.com: 8014 URL - это адрес страницы статуса «Shoutcast», а не аудиопоток. Если вы хотите аудио поток, URL будет: http://str45.streamakaci.com: 8014 /; stream"поток" в конце здесь не важен и может быть любой строкой или даже http://str45.streamakaci.com: 8014 / ; будет работать нормально Итак, давайте проверим заголовки потока:

lynx -mime_header "http://str45.streamakaci.com:8014/;stream"
ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-name:Radio Flemme MP3
icy-genre:Various
icy-url:http://www.radioflemme.com
content-type:audio/mpeg
icy-pub:0
icy-br:128

все это не указано c до Java, я не могу сказать вам код, но могу подтвердить, что этот Shoutcast возвращает заголовки правильно .

...