Implementing a TCP socket channel
The base.Channel
class provides methods to implement basic TCP client and server
programs. Consider character set encodings when designing such programs: No implicit character
set conversion is done by the runtime system. Both client and server must use the same
character set and length semantics.
The following code example implements a client program connecting to a TCP port, using
the openClientSocket()
method:
MAIN
DEFINE ch base.Channel,
time DATETIME HOUR TO SECOND,
data STRING
LET ch = base.Channel.create()
CALL ch.openClientSocket("localhost",99999,"u",3)
CALL ch.writeLine("get_time")
LET time = ch.readLine()
DISPLAY "client 1: ", time
CALL ch.writeLine("get_string")
LET data = ch.readLine()
DISPLAY "client 2: ", data
CALL ch.writeLine("disconnect")
CALL ch.close()
END MAIN
The next code example implements the server program that can be used with the above client
program. The server program uses the openServerSocket()
and readLine()
methods to
listen to a given TCP interface/port. Note that the connection with a client must be ended by
sending an EOF character (ASCII 26) to the client, the next readLine()
call
will wait for a new client connection, or select a pending client connection:
MAIN
DEFINE ch base.Channel,
cmd, data STRING
LET ch = base.Channel.create()
DISPLAY "starting server..."
CALL ch.openServerSocket(null, 99999, "u")
WHILE TRUE
LET cmd = ch.readLine()
IF ch.isEof() THEN
DISPLAY "Connection ended by client..."
EXIT WHILE
END IF
DISPLAY "cmd: ", cmd
IF cmd == "get_time" THEN
CALL ch.writeLine(CURRENT HOUR TO SECOND)
END IF
IF cmd == "get_string" THEN
LET data = "This is a string..."
CALL ch.writeLine(data)
END IF
IF cmd == "disconnect" THEN
CALL ch.writeLine(ASCII 26) -- EOF
END IF
END WHILE
DISPLAY "end of server..."
END MAIN