-Заявление, держитесь подальше от мертвых людей. Ядром этого блога является не префикс if-else+, а как определить частный протокол через структуру обработки протокола URL
Разница между URI и URL
URI (единый идентификатор ресурсов) идентификатор ресурсов; URL (Расположение единообразного ресурса) единый локатор ресурсов (или Unified Resource Locator); URI - относительно широкая концепция. URL - это тип URI и подмножество механизма именования URI. Можно сказать, что URI является абстрактным, и конкретное использование URL -адресов для поиска ресурсов. URI, как правило, указывает не на путь физического ресурса, а отображенный идентификатор ресурса во всей системе. URL -адреса - это строки, используемые в Интернете для описания информационных ресурсов, в основном используемых в различных клиентских программах WWW и серверных программах. Использование URL -адресов может использовать унифицированный формат для описания различных информационных ресурсов, включая файлы, адреса сервера и каталоги и т. Д.
1. Давайте первым предисловием
Мы привыкли к http
Url url = новый URL (http://www.apptest.com:8080/test/ios.php);
Мы тоже должны привыкнуть к этому
Конечно, нам также нужно привыкнуть к URL.
«https», «ftp», «mailto», «telnet», «file», «ldap», «Gopher», «jdbc», «rmi», «jndi», «jar», «doc», «netdoc», «nfs», «verbatim», «пальцы», «дневное», «Система», «Systemresource», «SystemResour
Url url = new URL ("oschina: //www.apptest.com: 8080/test/ios.php");Если вы не привыкли к этому, всегда будут происходить следующие исключения
java.net.malformedurlexception: неизвестный протокол
При использовании Ajax в браузерах Android не определены протоколы не будут поддерживать.
2. Понимание пользовательских протоколов
Протокол: В мире программирования сам протокол представляет собой набор правил ограничения ввода/подъема. Поэтому наш точный протокол должен вращаться вокруг ввода -вывода, поэтому протокол здесь можно назвать протоколом ввода -вывода.
Соглашение инициатор: запрос
Протокол Респондент: ответ
Условия для установления Соглашения: запрос и ответ признают тот же набор соглашений и сообщают в соответствии с ограничениями соглашения.
3. Взаимосвязь между пользовательским протоколом и URL
На Java требуются ли пользовательские протоколы URL?
Ответ нет.
На самом деле, вокруг ввода/вывода определения правил полностью находятся в наших руках. Он не говорит, что Земля не развернется после выхода из URL, и Java будет уничтожена.
Зачем настраивать протокол с помощью классов URL?
Ответ заключается в том, что URL является зрелой структурой обработки протокола.
Пользовательский протокол URL, упомянутый здесь, по сути, больше о расширении протокола через существующие правила.
4. URL Custom Private Protocol Practice
Мы знаем, что пользовательские протоколы требуют ответа и запроса, и обе стороны должны полностью понять согласие друг друга. Для удобства здесь мы используем сервер протоколов HTTP в качестве ответа.
Здесь мы используем NGNIX Server + PHP + FASTCGI для создания ответа, и код развертывания выглядит следующим образом
1. Определите ответ
<? php $ raw_post_data = file_get_contents ('php: // input', 'r'); echo "-------/$ _ post ------------------/n <br/>"; echo var_dump ($ _ post). "/n"; echo "------- php: // input -------------/n <br/>"; echo $ raw_post_data. "/n <br/>"; $ rs = json_encode ($ _ server); file_put_contents ('text.html', $ rs); echo '写入成功';2. Определите запрос
2.1 Реализация фабрики UrlStreamHandlerFactory, в основном используется для генерации процессоров протокола
Общедоступный класс EchourlStreamHandlerFactory реализует urlStreamHandlerFactory {public urlStreamHandler CreateUrlStreamHandler (String Protocol) {// Настройка различных запросов схемы посредством диверсии здесь. Конечно, удрученные люди думают, что это основной код. URL - это структура обработки протокола. Если if-else является ядром, Oracle собирается обанкротиться if (protocol.equals ("echo") || protocol.equals ("oschina")) {return new echourlstreamhandler (); // создание обработчика обработки протокола} return null; }}2.2 Реализация UrlStreamHandler, основная функция состоит в том, чтобы генерировать соответствующий разъем протокола
открытый класс EchourlStreamHandler Extends urlStreamHandler {@OverrideProtected urlConnection OpenConnection (url u) бросает ioException {return new EchourlConnection (u); // Мы также можем выполнить соответствующую диверсию здесь}} 2.3 Реализовать UrlConnection, которая представляет собой настройку правил связи протокола. Здесь мы используем протокол HTTP в качестве правил связи. Здесь мы подражаем запросам протокола HTTP
(Ниже приведен код основного. Протокол HTTP , заимствованный здесь. Конечно, вы можете взаимодействовать с различными протоколами, используя WebSocketocket, SMTP и FTP, вместо префикса URL IF-ELSE+, которые люди с мерзостью просят, что люди просят меня признать ).
открытый класс EchourlConnection Extends urlConnection {private Socket Connection = null; public final Static int default_port = 80; public echourlConnection (url url) {super (url);} public synchroniced inputStream getInputStream () throwSception {if (! Connected) {connect () return Connection. OutputStream getOutputStream () throws ioException {if (! Connected) {connect ();} return Connection.getOutputStream ();} public String getContentType () {return "Text/plain";} public synchronized void connect () throws ioExcept = Default_port; this.connection = new Socket (url.gethost (), port); // истинное значение для отключения буферизации сокета и немедленно отправить данные. this.connection.setReaseAddress (true); // Указывает время ожидания ожидания при получении данных, в миллисекундах. Значение по умолчанию составляет 0, что означает, что не будет бесконечное ожидание, и никогда не будет время -аут // при чтении данных через входной поток гнезда, если нет данных, он будет ждать //, что вы можете подключить, вы можете подключить, что вы можете подключить, что вы можете подключить, вы все равно, что вы можете подключить, вы все равно подключны. Прочитайте данные снова this.Connection.SetSotimeout (30000); // Указывает, является ли базовый розетка немедленно закрыто // Когда гнездо закрыт, базовый сокет будет задержан на 5 секунд, а затем снова закрыт. Через 5 секунд все оставшиеся данные, которые не были отправлены, будут отброшены. По умолчанию, если метод socket.close () () выполняется, метод немедленно вернется, но базовый сокет фактически не будет закрыт сразу // он задержится в течение периода времени, пока все оставшиеся данные не будут отправлены, а сокет будет по -настоящему закрытым и отключенным // Советы: когда программа записывает данные через выходные потока, это означает, что программа подчиняет данные. Программа закрывает сокет, возможно, что партия данных по -прежнему передается в сети и не достигла кончиков приемника //: «оставшиеся оставшиеся данные», упомянутые здесь this.connection.setsendbuffersize (1024); // Указывает размер буфера, в котором данные получены. Не передавайте данные друг другу)? True - это да // его значение по умолчанию неверно, что означает, что TCP не будет следить за действительным соединением, и неактивные клиенты могут существовать навсегда без уведомления о том, что сервер сбоял это. Connection.SetakeBeantive (true); // Указывает, поддерживает ли он отправка одного байта экстренных данных TCP. Socket.sendurgentData (данные) используется для отправки одного байта экстренных данных TCP // по умолчанию по умолчанию, то есть приемник не выполняет никакой обработки при получении аварийных данных и непосредственно отбрасывает их. Если пользователь хочет отправить аварийные данные, его следует установить на true // после настройки на истину, приемник будет размещать полученные аварийные данные в ту же очередь, что и обычные данные this.connection.setoobinline (true); // Этот метод используется для установки типа службы. Следующий код запрашивает высокую надежную и минимальную службу передачи передачи (биты или операции 0x04 и 0x10) // сокета. 0x10: минимальная задержка (пятая предпоследняя бина двоичного файла-1) this.connection.settrafficclass (0x04 | 0x10); // Этот метод используется для установки относительной важности времени подключения, задержки и пропускной способности (три параметра этого метода представляют три индикатора передачи сети) // Средство параметра, это означает, что с минимальным временем с минимальным временем ///////memum-separeters с минимальным временем ///////memommum с минимальным временем. latency-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- url.getPath () + "http/1.1 /r/n") ;/if(url.getport()<0 || url.getport ()> 65536) {sb.append ("host:"). Append (url.gethost ()). Append ("/r/n");} else {sb.append ("host:"). Append (url.get Host ()). Append (":"). Append (url.getport ()). Append ("/r/n");} sb.append ("Соединение: Keep-alive/r/n"); sb.append ("Дата: пятница, 22 апреля 2016 13:17:35 GMT/R/N "); SB.Append (" VARY: ACCET-ENCODING/R/N "); SB.Append (" Тип контента: приложение/x-WW-form-Urlencoded, charset = UTF-8/r/n "); SB.Append ("-lengle: ") .append (" name = zhangsan & password = 123456 ".getbytes (" utf-8 "). Length) .append ("/r/n "); sb.append ("/r/n "); this.concection.getOutputStream (). write (sb.toString () Dinsonnect () бросает ioException {if (connected) {this.connection.close (); this.connected = false;}}} Здесь определение протокола было завершено.
Наш тестовый код выглядит следующим образом
Попробуйте подключиться к Oschina: // localhost: 8080/test/ios.php
Url.seturlstreamhandlerfactory (new EchourlStreamHandlerFactory ()); // urlConnection.SetContentHandlerFactory (new EchoContentHandlerFactory ()); url url = new url ("Oschina: // localhost: 8080/test/ios.php"); connection = (echourlConnection) url.openconcenection (); connection.setDoOutput (true); connection.setDoinput (true); Printwriter pw = new PrintWriter (new outputStreamWriter (connection.getOutputStream ())); pw.write ("name = zhangsan & password = 123456"); pw.flush (); Inputstream stream = connection.getInputStream (); int len = -1; Byte [] buf = новый байт [256]; while ((len = stream.read (buf, 0, 256))>-1) {String line = new String (buf, 0, len); if (line.endswith ("/r/n0/r/n/r/n") && len <256) {// Сервер возвращает кодировку с переводом,/r/n0/r/n/r/n означает, что чтение заканчивается, анализ кодировки: http://dbscx.iteye.com/blog/8304444. line.length ()-"/r/n0/r/n/r/n" .length ()); System.out.println (Line); перерыв; } else {System.out.println (line); }} pw.close (); stream.close ();Результаты бега
Результат показывает, что протокол действительно был успешно определен
Конечно, приведенный выше анализ данных не соответствует нашим требованиям, потому что это информация о кодировании. Как проанализировать его соответствовать требованиям, пожалуйста, переместите :
Http -щит
5. Позже, пользовательский анализатор Minetype
ContentHandlerFactory предоставляется в Java для анализа MineType. Мы сформулируем наш собственный анализатор здесь. Конечно, JDK предоставляет более обильно. Мы делаем здесь, чтобы удовлетворить особые потребности.
Открытый класс EchoContentHandler Extends ContentHandler {public Object getContent (UrlConnection Connection) Throws ioException {inputStream in = connection.getInputStream (); BufferedReader Br = new BufferedReader (new InputStreamRead (in)); return Br.Readline ();} public getContent (urlConection Connectionecemex in Connectionexecemex in Connectionexecemexecemecemexecemecemexecemece) Connection.getInputStream (); for (int i = 0; i <classe.length; i ++) {if (classs [i] == inputstream.class) return in; else if (class [i] == string.class) return getContent (connection);} return;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Использование очень просто
UrlConnection.SetContentHandlerFactory (new EchoContentHandlerFactory ());