Daniel Campos wrote:

Сеть и XML

Введение

Будущее, по крайности в следующие годы, базируется на сетях и стандартах.

Даже большие компании, которые всегда пытаются скрыть все их внутренние форматы файлов, частично изменили свои соображения, и теперь, похоже, они открыли пламя, если говорить о XML, SOAP, RPC, и вещах им подобным, что, возможно, могло бы быть обычной штукой сегодня, если они вложили некоторые усилия и деньги в них в прошлом. 

Думаю, что...

Никто не может себе представить отдельные устройства сегодня : вы должны извлекать из них данные, знать, что происходит, даже если вы на другом конце земли.

Устройства изготавливаются разными производителями, а покупатели думают, что это не их забота делать их совместимыми. Так что, компаниям нужны стандарты для совместного использования информации.

Компаниям нужно управлять их деньгами, информация - это сила и шанс увеличить и заработать новые деньги. Компании доверяют поддержку большим аппаратным и программным компаниям.

Значит...

Новые системы клиентских приложений back-office, предоставляемые основным компаниями, базируются на известных стандартах, главным образом : базы данных (SQL), http серверы, подобные Apache, XML, RPC и SOAP. Если большая компания идут таким путем, средние и маленькие компании делают то же самое...или умирают.

XML, RPC и SOAP

Когда кто-то изучает XML, первая мысль - это "что за глупость". Прекрасно, XML кажется должно быть только бирками и случайными данными, которые вы кладете в файл. И  XML действительно таково. Сила XML в том, что есть международный стандарт, и что это может лего использоваться людьми и компьютерами. Множество людей может изучить его, не только программисты, создавать реализации, писать XML документ в текстовом редакторе, а множество библиотек и других программ будет помогать им растпространить их документы, или транслировать в HTML или PDF прекрасные сообщения.

А HTTP - это только протокол, их множество. Протоколы - это то же, что языки для людей, если двое из многих людей знают один язык, они могут совместно использовать информацию. Но рождение Arpanet и рост Internet сделали этот протокол весьма популярным: он используется для получения web страниц, изображений, файлов, коммерческих данных и всего материала, который вы можете себе вообразить, с серверов, размещенных по всей земле. Так что, все сетевое оборудование и программное обеспечение (роутеры, брандмауэры, компьютеры пользователей, серверы...) готовы обслуживать этот протокол. Подумайте еще раз: если вы используете HTTP для посылки и получения вашей информации, вам не нужно беспокоиться о физическом местонахождении вашей цели : вся аппаратура на земле, большая сеть из подсетей, будут нести информацию, не задавая вам вопросов, только нажмите правую клавишу (ладно, обычно левую клавишу мышки), и позвольте большой машине работать.

Вот где мы найдем XML-RPC и SOAP. Они - протоколы, позволяющие компьютерам говорить друг с другом. Используя такой протокол, они могут делать больше, что распространять некоторые документы: один компьютер может послать другому компьютеру порядок выполения некоторой задачи, а затем другой компьютер вернет результат действий. Вы можете найти это в вашем компьютере : некоторые программы обращаются к библиотекам и другим программам для выполнения своей работы. Только одна новая вещь в XML-RPC и SOAP, и теперь, разговор не только в вашем компьютере, но между компьютерами.

Но это великая вещь. Идея совсем не нова, но теперь она базируется на стандартах формата сетей и данных: для переноса информации HTTP, для записи порядка, вопросов и ответов, XML. Результатом этого становится то, что сегодня совсем легко для программистов и даже некоторых пользователей, написать программы, которые будут соединяться с другими программами, работающими на других компьютерах в другой части земли. И еще, что очень важно, вы не нуждаетесь в том, чтобы иметь определенную аппартно-программную платформу, они стандартны : вы можете купить аппаратуру и программное обеспечение у многих разных поставщиков. Вы можете купить то, что вам нужно : низкая стоимость? высокие характеристики? масштабируемость?, только посмотрите, сравните и купите или даже используйте свободно все что для вас лучше.

Gambas должен быть там

Gambas нуждается в стандартах, и я скажу больше : Linux нуждается в Gambas. Gambas - это интерпретатор языка BASIC. BASIC легкий язык, любой может слегка поучить и начать делать маленькие программы и скрипты. Многие программисты начинали с изучения BASIC, когда были детьми, может быть на 8-битовых CPU. Многие люди, работающие в разных отделах разных компаний, знают хотя бы слегка язык BASIC. Они совсем не программисты, но они получают то, что им нужно, поскольку могут написать макросы, помогающие им в их работе с небольшими, и побольше, базами данных, таблицами и текстовыми документами. Они знают, как создать справочник, записать и прочитать данные из таблиц, распространить некоторую информацию, отправляя ее по почтеl... С другой стороны есть легион web разработчиков, слишком занятых, чтобы узнавать об указателях и обслуживании памяти, они должны писать HTML, создавать красивые картинки, администрировать серверы, иметь дело с хакерами и многими другими вещами. Они нуждаются в простом языке для создания CGI. Есть такие вещи, как PHP или Perl, но есть и еще одно, называемое ASP, что ни что иное, как BASIC, смешанный с HTML, так что оин знают BASIC.

Итак, заключение таково - есть множество людей, ожидающих BASIC для миграции на Linux. Что мы можем здесь сделать? Мы посреди дороги : у нас есть простой и хорошо разработанный GUI (не многие проекты могут сказать такое), у нас есть интерпретатор, и у нас есть множество библиотек, написанных на C или C++, ожидающих, чтобы помочь нам, может быть, наибольшее количество API, чем известно даже любой операционной системе. Чтобы перейти на другую сторону нам нужно только реализовать стандарты, которые позволят программистам и пользователям соединять информацию, в которой они нуждаются.

Компонет Network - часть этой цели: давайте, откроем дверь, которая откроет нам остальной мир.

Компонет Network

Это в действительности не компонент, это будет реализовано в (хотя бы) трех компонентах: "net" "net.curl" и "gbxml".

"Net" - это база всего:

В настоящее время web базируется на TCP/IP протоколах. Мы можем сказать, что IP часть этого протокола - это сущность операционной системы, мы должны позаботится о "TCP/" части. Для реализации всего материала мы имеем следующие классы:

"Net.curl"

'libcurl' - это свободная и портативная библиотека, написанная некоторыми людьми из http://curl.haxx.se. Она предоставляет все кусочки, необходимые для обслуживания высокоуровневых сетевых протоколов, таких как HTTP, FTP и TELNET. Эта библиотека будет полезна для написания компонет со следующими классами:

"GBXML" - инструменты для соединения с миром: (GBXML пока полностью не реализовано)

В будущем будет работа на фронте SOAP. Идея SOAP очень похожа на XML-RPC, также базируемая на XML и HTTP, но с SOAP вы можете выполнять очень сложные задачи, это очнь мощная, но, с другой стороны, достаточно сложная вещь.

Программирование с компонентом "Net"

Соединенные сокеты: Клиент и Сервер

Сокет - это только место, из которого вы можете читать и куда можете записать данные. Однако определение сокетов не говорит о серверах, клиентах, соединениях и т.д., это концепция, находящаяся на следующем этаже. TCP и Local сокеты - особые реализации сокетов, в которых есть контроль потока (flow control) и спецификации ролей программы : клиент и сервер.

Есть два пути работать с соединенными соектами:

Теперь давайте, реализуем две программы, чтобы поиграть с TCP и Local сокетами:

Клиентская сторона : действующая подобно TCP или Local (Unix) клиенту

Для создания программы, в которой вы соединитесь с удаленным или локальным сервером, используя TCP сокеты или Local сокеты, вы должны использовать класс "Socket". Мы будем использовать здесь два способа реализации, первая реализация не использует никаких событий.:

 ' Gambas module file
PUBLIC MySock AS Socket
...
...
PUBLIC SUB Main()
MySock=NEW Socket
....
   ...
MySock.Connect ( "name_of_host",3450 )
...

   ...   
MySock.Connect ("/path/to/socket")
...

...
Do While (MySock.Status <> 7) And (MySock.Status >0 )
Wait(0.1)
Loop
...
 ...
If MySock.Status<>7 Then
PRINT "Error"
Quit
End if
Write #MySock, "hello",5
...

...
Do While Lof(MySock)=0
Wait(0.1)
Loop
Read #MySock, sBuf, Lof(MySock)
Print sBuf
...

....
CLOSE #MySock
PUBLIC MySock AS Socket

PUBLIC SUB Main()

DIM sBuf AS String
MySock=NEW Socket

MySock.Connect ( "name_of_host",3450 )

DO WHILE (MySock.Status <> 7) AND (MySock.Status >0 )
Wait(0.1)
LOOP
IF MySock.Status<>7 THEN
PRINT "Error"
QUIT
END IF

WRITE #MySock, "hello",5

DO WHILE Lof(MySock)=0
Wait(0.1)
LOOP

READ #MySock, sBuf, Lof(MySock)
PRINT sBuf
CLOSE #MySock

END

    ' Gambas class file
STATIC App AS ClsMain
PUBLIC MySock AS Socket
....

...
PUBLIC SUB _New()
MySock=NEW Socket AS "MySock"
MySock.Connect("name_of_host",3450)
END
...
...
STATIC PUBLIC SUB Main()
App=NEW ClsMain
END
...
...
PUBLIC SUB MySock_Ready()
WRITE #MySock,"Hello",5
END
...
...
PUBLIC SUB MySock_Error()
PRINT "Unable to connect"
END
...
...
PUBLIC SUB MySock_Read()
DIM sCad AS String
READ #MySock,sCad,Lof(MySock)
PRINT sCad
CLOSE #MySock
END
....
' Gambas class file
STATIC App AS ClsMain
PUBLIC MySock AS Socket

PUBLIC SUB MySock_Ready()

WRITE #MySock,"Hello",5

END

PUBLIC SUB MySock_Read()

DIM sCad AS String
READ #MySock,sCad,Lof(MySock)
PRINT sCad
CLOSE #MySock

END


PUBLIC SUB _New()

MySock=NEW Socket AS "MySock"
MySock.Connect("name_of_host",3450)


END

PUBLIC SUB MySock_Error()

PRINT "Unable to connect"

END

STATIC PUBLIC SUB Main()

App=NEW ClsMain

END

Серверная сторона : действующая подобно TCP или Local (Unix) серверу

Чтобы сервер работал, нам нужен класс 'ServerSocket'. Он слушает соединения и возвращает новый объект Socket для каждого клиентского соединения, так что мы можем обслуживать множество клиентов.

STATIC Server AS ClsServer
PUBLIC Clients AS Object[]
PUBLIC Srv AS ServerSocket
...
...
STATIC PUBLIC SUB Main()
Server=NEW ClsServer
END
...
...
PUBLIC SUB _New()
Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Port=3450
Srv.Type=ServerSocket.Internet
Srv.Listen()
END
...
...
PUBLIC SUB _New()
Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Path="/path/to/my/socket"
Srv.Type=ServerSocket.Local
Srv.Listen()
END
...
...
PUBLIC SUB Srv_Connection(Host AS String)
DIM MySock AS Socket
PRINT "Accepting connection from --> " & Host
MySock=Srv.Accept()
Clients.Add(MySock)
END
...
...
PUBLIC SUB Socket_Read()
DIM sCad AS String
READ #LAST,sCad,Lof(LAST)
PRINT "Received data -->" & sCad
WRITE #LAST,"bye",3
END
...

...
PUBLIC SUB Socket_Closed()
PRINT "Connection closed"
Clients.Remove(Clients.Find(LAST))
END
...

' Gambas class file
STATIC Server AS ClsServer
PUBLIC Clients AS Object[]
PUBLIC Srv AS ServerSocket

PUBLIC SUB Socket_Read()

DIM sCad AS String
READ #LAST,sCad,Lof(LAST)
PRINT "Received data -->" & sCad
WRITE #LAST,"bye",3

END

PUBLIC SUB Socket_Closed()

PRINT "Connection closed"
Clients.Remove(Clients.Find(LAST))

END

PUBLIC SUB Srv_Connection(Host AS String)

DIM MySock AS Socket
PRINT "Accepting connection from --> " & Host
MySock=Srv.Accept()
Clients.Add(MySock)

END


PUBLIC SUB _New()

Clients =NEW Object[]
Srv=NEW ServerSocket AS "Srv"
Srv.Port=3450
Srv.Type=ServerSocket.Internet
Srv.Listen()

END

STATIC PUBLIC SUB Main()

Server=NEW ClsServer

END