Turn any program that uses STDIN/STDOUT into a WebSocket server. Like inetd, but for WebSockets.
websocketdis a small command-line tool that will wrap an existing command-line interface program, and allow it to be accessed via a WebSocket.
WebSocket-capable applications can now be built very easily. As long as you can write an executable program that reads
STDINand writes to
STDOUT, you can build a WebSocket server. Do it in Python, Ruby, Perl, Bash, .NET, C, Go, PHP, Java, Clojure, Scala, Groovy, Expect, Awk, VBScript, Haskell, Lua, R, whatever! No networking libraries necessary.
websocketdwill start a WebSocket server on a specified port, and listen for connections.
Upon a connection, it will fork the appropriate process, and disconnect the process when the WebSocket connection closes (and vice-versa).
Any message sent from the WebSocket client will be piped to the process's
STDINstream, followed by a
Any text printed by the process to
STDOUTshall be sent as a WebSocket message whenever a
\nnewline is encountered.
If you're on a Mac, you can install
websocketdusing Homebrew. Just run
brew install websocketd. For other operating systems, or if you don't want to use Homebrew, check out the link below.
To get started, we'll create a WebSocket endpoint that will accept connections, then send back messages, counting to 10 with 1 second pause between each one, before disconnecting.
To show how simple it is, let's do it in Bash!
#!/bin/bash for ((COUNT = 1; COUNT <= 10; COUNT++)); do echo $COUNT sleep 1 done
Before turning it into a WebSocket server, let's test it from the command line. The beauty of
websocketdis that servers work equally well in the command line, or in shell scripts, as they do in the server - with no modifications required.
$ chmod +x count.sh $ ./count.sh 1 2 3 4 5 6 7 8 9 10
Now let's turn it into a WebSocket server:
$ websocketd --port=8080 ./count.sh
Finally, let's create a web-page to test it.
Open this page in your web-browser. It will even work if you open it directly from disk using a
Got more examples? Open a pull request.
And follow @joewalnes!