#java
Есть URL. Нужно чтобы был отправлен запрос : т.е. Java перешла по ссылке. И получила ответ : в виде Wav файла,который необходимо воспроизвести. Как это реализовать?Какие дополнительные библиотеки нужно подключить? Посмотрел похожие темы,есть реализованная на PHP. Но нужна Java. Отправить запрос насколько мне известно можно так : URL url = new URL("https://"); url.openConnection(); А вот как полученный ответ в виде Waw файла сохранить и воспроизвести.Хотя сохранять необязательно. ещё увидел вот такую конструкцию import java.applet.Applet; import java.applet.AudioClip; import java.net.URL; public class MainClass { public static void main(String[] args) { try { URL url = new URL("file:youraudiofile.wav" ); AudioClip ac = Applet.newAudioClip(url); ac.play(); System.out.println("Press any key to exit."); System.in.read(); ac.stop(); } catch (Exception e) { System.out.println(e); } } Вся проблема в том,что когда переходишь по ссылке итоговая страница уже воспроизводит звук в браузере. А нужно чтобы Java сохранила файл,дала ему расширение. Пример простой попытки включить аудио-файл: package sayme; import java.io.IOException; import java.net.*; import java.applet.*; public class URLReader { public static void main(String a[]) { try { String str1 = "http://dll.zf.fm/music/f/7e/clean_bandit_feat_sean_paul__anne-marie_-_rockabye_(zf.fm).mp3"; URL url = new URL(str1); // 1 AudioClip clip = Applet.newAudioClip(url); clip.play(); } catch (java.net.MalformedURLException e) { e.printStackTrace(); } } } я не слышу звук,когда выполняется код. даже если после поставить вот так : clip.play(); Thread.sleep(10000); программа отработает 15 секунд и выключится. программа отлично работает с файлами которые имеются в системе,а не в интернете. естественно,если перейти по этой ссылке в браузере - он включит это трек в браузере. А вот воспроизвести так сказать из кода он не даёт. В чем проблема?
Ответы
Ответ 1
Отправить запрос насколько мне известно можно так : URL url = new URL("https://"); url.openConnection(); Цитата Это не совсем так... URL url = new URL("https://"); - просто создается инстанс URL. url.openConnection(); - создается инстанс коннекта (URLCOnnection). Но никаких данных еще никуда не отправлено. Это только заготовка. Помимо этого недурно еще установить параметры коннекта: будет ли он принимать/отправлять данные (setDoInput(), setDoInput()), метод запроса (GET, POST, PUT и т.д.), таймаут коннекта, указать заголовки запроса. В качестве примера: proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("", )); conn = (HttpURLConnection) url.openConnection(proxy); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(60000); conn.setRequestMethod("GET"); // подготовили коннект // Т.к. запрос у нас GET, то сразу принимаем входящие данные. // Вот тут как раз (при открытии InputStream ) и происходит отправка GET запроса на сервер. InputStream inStream = conn.getInputStream(); // Т.к. файл у нас бинарный, открываем ReadableByteChannel и создаем файл ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); FileOutputStream fos = new FileOutputStream("<имя_файла_для_сохранения>"); // Перенаправляем данные из ReadableByteChannel прямо канал файла. // Говорят, так быстрее, чем по одному байту вычитывать из потока и писать в файл. long filePosition = 0; long transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); while(transferedBytes == Long.MAX_VALUE){ filePosition += transferedBytes; transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); } rbc.close(); fos.close(); Если прокси нет, то conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); А вообще это хардкорный способ. Гораздо удобнее использовать библиотеку Apache HttpClient Код грубоват, но должен с работать. Но сначала советую попробовать скачать файл на более простом ресурсе, где нет "охранных систем": public class NewClass { public static void main(String[] args) throws IOException{ HttpURLConnection conn = null; try{ URL url = new URL("http://dll.zf.fm/music/f/7e/clean_bandit_feat_sean_paul__anne-marie_-_rockabye_(zf.fm).mp3"); conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); conn.setDoInput(true); //conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(60000); conn.setRequestMethod("GET"); // подготовили коннект // Т.к. запрос у нас GET, то сразу принимаем входящие данные. // Вот тут как раз (при открытии InputStream ) и происходит отправка GET запроса на сервер. InputStream inStream = conn.getInputStream(); // Т.к. файл у нас бинарный, открываем ReadableByteChannel и создаем файл ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); FileOutputStream fos = new FileOutputStream("qwe.mp3"); // Перенаправляем данные из ReadableByteChannel прямо канал файла. // Говорят, так быстрее, чем по одному байту вычитывать из потока и писать в файл. long filePosition = 0; long transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); while(transferedBytes == Long.MAX_VALUE){ filePosition += transferedBytes; transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); } rbc.close(); fos.close(); }catch(Exception e){ InputStreamReader inStream = new InputStreamReader(conn.getErrorStream()); char[] cbuf = new char[1]; String result= ""; BufferedReader in = new BufferedReader(inStream); while (in.read(cbuf) != -1) { result += String.valueOf(cbuf); } System.out.println("result:" + result); } } }
Комментариев нет:
Отправить комментарий