"SimpleEcho -- a simple TCP echo server in *********"
"Load the TCP package"
PackageLoader fileInPackage: 'TCP'!
"Define a class for our server, it stores (so far) a server socket"
Object subclass: #SimpleEchoServer
instanceVariableNames: 'ss'
classVariableNames: ''
poolDictionaries: ''
category: 'SimpleEcho'!
"Define a class method to create an instance given a port number"
!SimpleEchoServer class methodsFor: 'instance creation'!
port: anInteger
| ses |
ses := super new.
ses init: anInteger.
^ses
!!
"Instance method for initialization from above class method"
!SimpleEchoServer methodsFor: 'instance initialization'!
init: anInteger
ss := (TCP.ServerSocket port: anInteger).
^self
!!
"Instance method to handle running the main (infinite) loop"
!SimpleEchoServer methodsFor: 'running'!
run
| s |
[
ss waitForConnection.
s := (ss accept).
[self handleSocket: s] fork
] repeat
!!
"Instance method to handle each connection"
!SimpleEchoServer methodsFor: 'handling'!
handleSocket: s
[
| msg |
msg := (s nextLine).
msg displayOn: s.
(String with: (Character value: 10)) displayOn: s.
s flush
] repeat
!!
"Create an echo server"
Smalltalk at: #echoServer put: (SimpleEchoServer port: 8000)!
"Run it!"
echoServer run!