The future, al least for the next years, is based in networks and standards.
Even big companies that always tried to hide all its internal file formats, have changed partially its mind, and now it seems they have discovered the fire, talking about XML, SOAP, RPC, and things like this, that probably, could be usual stuff today if they were put some effort and money on them in the past.
No one can imagine isolated devices today : you have to extract data from them, know what's happening even if you are in the other side of the world.
Devices are made by different manufacturers, and costumers think it's not their matter to make them compatible. So, companies need standars to share information.
Companies need to control its money, information is power and a chance to grow and earn new money. Companies trust in the support of big hardware and software companies.
New back-office systems provided by main companies, are based on known standards, mainly : data bases (SQL), http servers like Apache, XML, RPC and SOAP. If big companies acts in that way, medium and small companies will do the same...or die.
When somebody is learning XML, the first idea is "what an stupid thing". Well, XML seems to be only tags and random data you put in a file. And XML is really that. The power of XML is that is an international standard, and that can be easily used by people and computers. Lots of people can learn it, not just programmers, create an implementation, write a XML document with a text editor, and lot of libraries and other software will help them to share their documents, or translate it to HTML or PDF beautiful reports.
And HTTP is just a protocol, there are lots of them. Protocols are what languages are for people, if two of more people know one language, they can share information. But the birth of Arpanet and the grow of Internet made this protocol quite popular: it is used to receive web pages, images, files, commercial data and all the stuff you can imagine from servers that are placed all around this world. So, almost all network hardware and software (routers, firewalls, end-user computers, servers...) is ready to manage this protocol. Think it twice: If you use HTTP to send and receive your information, you don't need to worry about the physical ubication of your target : all the hardware in the whole world, a big net of subnets, will carry the information without asking you any question, just press the right button (well, usually the left button of mouse) , and let the big machine work.
Here's where we find XML-RPC and SOAP. They are protocols to allow computers to talk between them. Using this protocol, they can do more than sharing some documents: one computer can send orders to other computer to perform some task, and then the second computer will return the result of the action. You can find this into your computer : some programs call to libraries and other programs to perform its work. The only new thing in XML-RPC and SOAP, is that now, conversations are not only into your computer, but between computers.
But this is a big thing. The idea is not new at all, but now, it is based on network and data format standards: To carry the information HTTP, to write orders, questions and answers, XML. The end of this is that today, it is quite easy for programmers and even for some users, to write programs that will be connected with other programs running in other computers, in different parts of the world. And the other important point, is that, you don't need to have a defined hardware-software platform, they are standards : you can both buy hardware and software from many different providers. You can buy what you need : low price? high performance? scalability?, just look, compare, and buy or even use freely the best thing for you.
Gambas needs to implement standars, and I'd say more : Linux needs Gambas. Gambas is a BASIC language interpreter. BASIC is an easy language, anybody can learn a little, and start making little programs and scripts. A lot of programmers started learning BASIC when they were children, may be on 8-bits CPUs. A lot of people working in different sections of different companies, knows at least a little of BASIC language. They are not programmers at all, but they have what they need as they can write macros to help them on his work with little and medium data bases, spread-sheets and text documents. They know how to create a formulary, write and read data from tables, share some information sending it by mail... By other side, there are tons of web depelopers, too busy to learn about pointers and memory management, they have to write HTML, create beautiful pictures, administrate servers, deal with hackers and many other things. They need a simple language to create CGI's. There are things like PHP or Perl, but there's one called ASP which is not more than BASIC mixed with HTML, so they know BASIC.
So, the conclusion is that lots of people are waiting for BASIC to migrate to Linux. What can we do here? We are in the middle of the road : we have a simple and well-designed GUI (not very much projects can say that), we have the interpreter, and we have lots of libraries written in C or C++ waiting to help us, may be the biggest API that any operating system has ever known. To cross to the other side we need only to implement that standars that will allow programmers and users to connect to the information they need.
Network component is a piece in that target: Let's open the door that will give us the rest of the world.
It is not really a component, it will be implemented in (al least) three components: "net" "net.curl" and "gbxml".
"Net" is the base of all:
Currently the web is based on TCP/IP protocols. We can say that the IP part of this protocol is matter of operating system, we have to care about "TCP/" part. To implement all stuff we have the following classes:
"Net.curl"
'libcurl' is a free and portable library written by some people at http://curl.haxx.se. It provides all the pieces needed to manage high level network protocols, like HTTP, FTP and TELNET. This library will be useful to write a component with the following classes:
"GBXML" are the tools to connect with the world: (GBXML is not yet fully implemented)
In the future there will be work on SOAP front. The idea of SOAP is quite similar to XML-RPC, it is also based on XML and HTTP, but with SOAP you can perform very complex tasks, it is powerful, but by the other side is quite complex.
A socket is just a place from where you can read and write data. However, socket definition does not speak about servers, clients, connections, etc, this is a concept placed in the next floor. TCP and Local sockets are particular socket implementations in which there are flow control and specifications about the program roles :client and server.
There are two ways to work with connected sockets:
Now let's implement two programs to play with TCP and Local sockets:
To create a program in which you will connect to a remote or local server using TCP sockets or Local sockets, you have to use "Socket" class. We will use here two ways to implement that, the first implementation does not use any event:
' 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
To work a a server, we need 'ServerSocket' class. It listen for connections, and returns a new Socket object for each client connection, so we can manage multiple clients.
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