nanomsg pair chat pasted by wasamasa on Sat Mar 5 21:01:38 2016
require 'nanomsg' # https://bitbucket.org/kschiess/nanomsg class Chat def initialize(name, url) @name = name @socket = NanoMsg::PairSocket.new() if @name == 'allan' @socket.bind(url) else @socket.connect(url) end @request = nil @response = nil receive() send() @request.join() @response.join() end def receive() @response = Thread.new do loop { message = @socket.recv() print("\r") puts message print('> ') } end end def send() @request = Thread.new do loop { print('> ') message = $stdin.gets().chomp() @socket.send("#{@name}: #{message}") } end end end if ARGV.count() != 2 puts "Usage: #{$0} <allan|bob> <url>" exit(1) end name = ARGV.shift() url = ARGV.shift() Chat.new(name, url)
naive port pasted by wasamasa on Sat Mar 5 21:02:01 2016
(use nanomsg srfi-18 extras matchable) (define socket #f) (define name #f) (define recv (make-thread (lambda () (let loop () (let ((message (nn-recv socket))) (printf "\r~a> " message) (loop)))))) (define (send) (let loop () (printf "> ") (let ((message (read-line))) (nn-send socket (format "~a: ~a" name message)) (loop)))) (define (chat name url) (set! socket (nn-socket 'pair)) (set! name name) (if (eqv? name 'allan) (nn-bind socket url) (nn-connect socket url)) (thread-start! recv) (send) (nn-close socket)) (define (main) (when (not (= (length (command-line-arguments)) 2)) (printf "~a: <allan|bob> <url>\n" (car (argv))) (exit 1)) (match-let (((target url) (command-line-arguments))) (case (string->symbol target) ((allan) (chat 'allan url)) ((bob) (chat 'bob url)) (else (print "Incorrect target") (exit 1))))) (main)
parley to the rescue! pasted by wasamasa on Sat Mar 5 21:44:57 2016
(use nanomsg srfi-18 extras matchable parley) (define socket #f) (define nick #f) (define recv (make-thread (lambda () (let loop () (let ((message (nn-recv socket))) (printf "\r~a\n> " message) (loop)))))) ;; non-blocking (define stdin (make-parley-port (current-input-port) prompt: "> ")) (define (send) (let loop () (let ((message (read-line stdin))) (when message (nn-send socket (format "~a: ~a" nick message)) (loop))))) (define (chat name url) (set! socket (nn-socket 'pair)) (set! nick name) (if (eqv? name 'allan) (nn-bind socket url) (nn-connect socket url)) (thread-start! recv) (send) (nn-close socket)) (define (main) (when (not (= (length (command-line-arguments)) 2)) (printf "~a: <allan|bob> <url>\n" (car (argv))) (exit 1)) (match-let (((target url) (command-line-arguments))) (case (string->symbol target) ((allan) (chat 'allan url)) ((bob) (chat 'bob url)) (else (print "Incorrect target") (exit 1))))) (main)
Allow quitting added by wasamasa on Sat Mar 5 22:19:23 2016
(use nanomsg srfi-18 extras matchable parley) (define socket #f) (define nick #f) (define recv (make-thread (lambda () (let loop () (let ((message (nn-recv socket))) (printf "\r~a\n> " message) (loop)))))) ;; non-blocking (define stdin (make-parley-port (current-input-port) prompt: "> ")) (define (send) (let loop () (let ((message (read-line stdin))) (when (string? message) (nn-send socket (format "~a: ~a" nick message)) (loop))))) (define (chat name url) (set! socket (nn-socket 'pair)) (set! nick name) (if (eqv? name 'allan) (nn-bind socket url) (nn-connect socket url)) (thread-start! recv) (send) (nn-close socket)) (define (main) (when (not (= (length (command-line-arguments)) 2)) (printf "~a: <allan|bob> <url>\n" (car (argv))) (exit 1)) (match-let (((target url) (command-line-arguments))) (case (string->symbol target) ((allan) (chat 'allan url)) ((bob) (chat 'bob url)) (else (print "Incorrect target") (exit 1))))) (main)