Chat server: Difference between revisions

Added zkl
m (→‎{{header|Go}}: opps fix typo in comment and omitted "continue")
(Added zkl)
Line 1,617:
set ::cmap {}; # Dictionary mapping nicks to channels
vwait forever; # Run event loop</lang>
 
=={{header|zkl}}==
{{trans|Python}}
On my Linux box, telnet seems to only want to connect to port 23.
<lang zkl>const PORT = 23;
var users=D(); // ( handle:socket, ...)
pipe:=Thread.Pipe(); // how server tells thread to connect to user
 
fcn accept(pipe){ // a thread waiting for the server to send a socket
while(socket:=pipe.read()){
println("Somebody is connecting ...");
socket.read(); // telnet stuff
while(True){ // get credentials
reg name;
socket.write("Your handle: "); // bottle neck
try{ name = socket.read().text.strip() } catch(IOError){ continue }
if(users.holds(name)) socket.write("Handle is already in use.\n");
else if(name){
users[name] = socket;
chat.launch(name,socket); // thread
broadcast(name, "+++ %s arrived +++".fmt(name));
break; // wait for next connection
}
}//while
}//while
}.launch(pipe); // thread
fcn chat(name,socket){ // a thread, one per user
try{
socket.write("^D to disconnect\n");
while(True){
message:=socket.read().text.strip();
if(not message or message=="\xff\xec") break; // ^D to disconnect.
broadcast(name, "%s> %s".fmt(name,message));
}
}catch{} // eg socket pukes
users.del(name); socket.close();
broadcast(name, "--- %s leaves ---".fmt(name));
}
 
// Send a message to all users from the given name.
fcn broadcast(name, message){
println(message); // log message to server console
users.pump(Void,'wrap([(toName,socket)]){
if(toName != name) try{ socket.write(message + "\n") } catch(IOError){}
});
}
 
// Set up the server socket.
server:=Network.TCPServerSocket.open(PORT);
println("Listening on %s:%s".fmt(server.hostname,server.port));
server.listen(pipe); // Main event loop </lang>
{{out}}
Start the server:
<pre>
$ sudo ../../../Bin/zkl chatServer.zkl
Listening on Octavius:23
Somebody is connecting ...
+++ sam arrived +++
--- sam leaves ---
Somebody is connecting ...
+++ sam arrived +++
Somebody is connecting ...
+++ craig arrived +++
craig> this is a test
sam> sam i am
--- sam leaves ---
^\
</pre>
Another terminal:
<pre>
$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Your handle: sam
^D to disconnect
+++ craig arrived +++
craig> this is a test
sam i am
^D
Connection closed by foreign host.
</pre>
And yet another terminal:
<pre>
$ telnet localhost
...
Your handle: craig
^D to disconnect
this is a test
sam> sam i am
--- sam leaves ---
Connection closed by foreign host.
</pre>
 
{{omit from|AutoHotkey}}
Anonymous user