|
Программирование >> Oracle
Пакет UTL TCP 1803 javagetline - это служебная функция. Многие протоколы Internet выдают результаты построчно , и возможность получить строку текста всегда пригодится. Например, возвращаемые протоколом HTTP заголовки - это строки текста. Эта функция работает с помощью метода DataInputStream.readLine, возвращая сроку полученных данных и добавляя при этом символы новой строки, удаленные функцией readLine Если данные не получены возвращается пустое значение: 48 static public void java getline(int p sock, String[] p data) 49 throws java.io.IOException 50 { 51 DataInputStream d = 52 new DataInputStream((sockets[p sock].getInputStream())); 53 p data[0] = d.readLine(); 54 if (p data[O] !=null) p data[0] += \n ; 55 } 56 Функция java disconnect тоже очень проста. Она устанавливает флаг в массиве socketUsed для сокета снова в ноль, показывая, что этот слот в массиве сокетов можно использовать повторно, и закрывает сокет: 57 static public void java disconnect(int p sock) 58 throws java.io.IOException 59 { 60 socketUsed[p sock] = 0; 61 (sockets[p sock]).close(); 62 } С помощью функции java peek sock можно проверить, есть ли в сокете данные для чтения. Это пригодится в ситуациях, когда клиент не хочет ждать поступления данных, блокируя другие действия. Проверив, есть ли что читать, можно предвидеть, будет ли получение данных заблокировано или данные будут сразу возвращены: 64 static public int java peek sock(int p sock) 65 throws java.io.IOException 66 { 67 return (sockets[p sock].getInputStream()).available(); 68 } Осталось еще несколько функций, связанных со временем. Функция java get timezone используется для получения часового пояса, установленного на сервере базы данных. Она особенно пригодится, если данные типа DATE надо преобразовать из одного часового пояса в другой с помощью встроенной функции NEWTIME или необходимо узнать, в каком часовом поясе работает сервер. Вторая функция, java get gmt, позволяет получить текущую дату и время на сервере по Гринвичу (GMT - Greenwich Mean Time): 70 static public void java get timezone(String[] p timezone) 71 { 72 tzDateFormat.setTimeZone(TimeZone.getDefault()); 73 p timezone[0] = tzDateFormat.fomat(new Date()); 1804 Приложение А 74 } 77 static public void java get gmt(String[] p gmt) 78 { 7 9 gmtDateFormat.setTimeZone(TimeZone.getTimeZone( GMT )); 8 0 p gmt[0] =gmtDateFormat.format(newDate()); 81 } Функция b64encode кодирует по алгоритму base64 переданную строку данных. Кодирование по алгоритму base64 - стандартный для Internet метод кодирования данных в виде последовательности 7-битовых символов ASCII для передачи по сетям. Мы будем использовать эту функцию, в частности, при реализации пакета для поддержки протокола HTTP, поскольку он поддерживает простейшую аутентификацию (используемую на многих Web-сайтах, требующих регистрации путем передачи имени пользователя и пароля). 83 static public void b64encode(byte[] p data, String[] p b64data) 84 { 85 p b64data[0] = encoder.encode(p data); 86 } Последняя функция в этом классе возвращает имя хоста, на котором работает сервер базы данных. Некоторые протоколы Internet требуют передавать эту информацию (например, протокол SMTP - простой протокол передачи сообщений электронной почты): 88 static public void java get hostname(String[] p hostname) 8 9 throws java.net.UnknownHostException 90 { 91 p hostname[0] = (InetAddress.getLocalHost()).getHostName(); 92 } 94 } 95 / Java created. Java-методы достаточно просты. Если вспомнить главу 19, для получения параметров в режиме OUT мы обязаны передавать массивы в Java-функцию. Поэтому большинство функций имеет вид: 40 static public void java recv data(int p sock, 41 byte[][] p data, int[] p length) Это позволяет возвращать значение в параметрах p data и p length. Теперь, при наличии Java-класса, можно создать тело пакета SIMPLE TCP CLIENT. Оно почти полностью состоит из интерфейсов к Java-методам: tkyte@TKYTE816> CREATE OR REPLACE PACKAGE BODY simple tcp client 2 as Пакет UTL TCP 1805 4 5 6 10 11 12 13 14 15 16 17 19 20 21 25 26 27 28 29 30 31 32 33 function connect to(p hostname in varchar2, p portno in number) return number as language java name jsock.java connect to(java.lang.String, int) return int; procedure send(p sock in number, p data in raw) as language java name jsock.java send data(int, byte[]); procedure recv i(p sock in number, p data out raw, p maxlength in out number) as language java name jsock.java recv data(int, byte[][], int[]); procedure recv(p sock in number, p data out raw, p maxlength in number default -1) l maxlength number default p maxlength; begin recv i(p sock, p data, l maxlength); if (l maxlength <> -1) then p data := utl raw.substr(p data, 1, l maxlength); else p data := NULL; end if; end; В данном случае есть две процедуры: RECV I и RECV. RECV I - это служебная процедура (суффикс I в имени означает internal), которую нельзя вызвать непосредственно за пределами пакета. Она вызывается процедурой RECV. Процедура RECV обеспечивает дружественный интерфейс к процедуре RECV I: она проверяет, б1ли ли прочитаны данные из сокета и если - да, устанавливает соответствующую ину. Если вспомнить представленный ранее Java-код, мы в]деляли буфер фиксированного размера в функции RECV и читали из сокета не более определенного количества байтов. В данном же случае необходимо изменить размер буфера так, чтобы он б1л равен количеству прочитанных байтов; для этого используется функция UTL RAW.SUBSTR. Если же данные не прочитаны, возвращается Null. 34 35 36 37 38 39 40 41 42 procedure getline i(p sock in number, p data out varchar2) as language java name jsock.java getline(int, java.lang.String[]); procedure getline(p sock in number, p data out raw)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |