Now, let's look at a further feature of the POSIX environment. It also supports writing network programs, that communicate over the Internet using sockets. A socket can be thought of as a two-way communication channel, consisting of both an RFile and a WFile.
Two network programs, which execute on different machines, may connect over the network and communicate using a socket. Typically, one of the programs will be a server and the other a client. Here is a trivial server, the EchoServer. This server waits indefinitely for clients to connect on port 12345. When a client connects, the server starts a session, where client input rows are echoed back to the client, prefixed by a line number. Several clients may be served concurrently and line numbering is independent for each client.
module EchoServer where import POSIX port = Port 12345 root w = do env = new posix w env.inet.tcp.listen port (server env.stdout) server logfile sock = class n := 1 p = show sock.remoteHost log str = logfile.write ('[':str ++ "]\n") echo str = action sock.outFile.write (show n ++"> "++str) n := n+1 close = request log (p ++ " closing") result () neterror str = action log ("Neterror: "++str) established = action log ("Connected from " ++ p) sock.inFile.installR echo result Connection{..}
Comments to the code:
In order to let you run the server, we provide a simple client, TCPClient. We do not list the code here; you may review it in TCPClient.t. The client accepts a host name and a port number as command line arguments and connects to a server on that address. When a connection is established, the client accepts user input lines, sends them to the server and displays replies obtained on the screen.