2020-04-01 03:37:22 +02:00
<!doctype html>
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
< meta http-equiv = "x-ua-compatible" content = "ie=edge" >
< meta name = "lang:clipboard.copy" content = "Copy to clipboard" >
< meta name = "lang:clipboard.copied" content = "Copied to clipboard" >
< meta name = "lang:search.language" content = "en" >
< meta name = "lang:search.pipeline.stopwords" content = "True" >
< meta name = "lang:search.pipeline.trimmer" content = "True" >
< meta name = "lang:search.result.none" content = "No matching documents" >
< meta name = "lang:search.result.one" content = "1 matching document" >
< meta name = "lang:search.result.other" content = "# matching documents" >
< meta name = "lang:search.tokenizer" content = "[\s\-]+" >
< link rel = "shortcut icon" href = "../assets/images/favicon.png" >
< meta name = "generator" content = "mkdocs-1.1, mkdocs-material-4.6.3" >
< title > Cobra - IXWebSocket< / title >
< link rel = "stylesheet" href = "../assets/stylesheets/application.adb8469c.css" >
< script src = "../assets/javascripts/modernizr.86422ebf.js" > < / script >
< link href = "https://fonts.gstatic.com" rel = "preconnect" crossorigin >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback" >
< style > body , input { font-family : "Roboto" , "Helvetica Neue" , Helvetica , Arial , sans-serif } code , kbd , pre { font-family : "Roboto Mono" , "Courier New" , Courier , monospace } < / style >
< link rel = "stylesheet" href = "../assets/fonts/material-icons.css" >
< / head >
< body dir = "ltr" >
< svg class = "md-svg" >
< defs >
2019-11-27 18:10:09 +01:00
2020-04-01 03:37:22 +02:00
< / defs >
< / svg >
< input class = "md-toggle" data-md-toggle = "drawer" type = "checkbox" id = "__drawer" autocomplete = "off" >
< input class = "md-toggle" data-md-toggle = "search" type = "checkbox" id = "__search" autocomplete = "off" >
< label class = "md-overlay" data-md-component = "overlay" for = "__drawer" > < / label >
< a href = "#general" tabindex = "0" class = "md-skip" >
Skip to content
< / a >
< header class = "md-header" data-md-component = "header" >
< nav class = "md-header-nav md-grid" >
< div class = "md-flex" >
< div class = "md-flex__cell md-flex__cell--shrink" >
< a href = ".." title = "IXWebSocket" aria-label = "IXWebSocket" class = "md-header-nav__button md-logo" >
< i class = "md-icon" > < / i >
< / a >
< / div >
< div class = "md-flex__cell md-flex__cell--shrink" >
< label class = "md-icon md-icon--menu md-header-nav__button" for = "__drawer" > < / label >
< / div >
< div class = "md-flex__cell md-flex__cell--stretch" >
< div class = "md-flex__ellipsis md-header-nav__title" data-md-component = "title" >
< span class = "md-header-nav__topic" >
IXWebSocket
< / span >
< span class = "md-header-nav__topic" >
Cobra
< / span >
< / div >
< / div >
< div class = "md-flex__cell md-flex__cell--shrink" >
2019-11-27 18:10:09 +01:00
2020-04-01 03:37:22 +02:00
< label class = "md-icon md-icon--search md-header-nav__button" for = "__search" > < / label >
< div class = "md-search" data-md-component = "search" role = "dialog" >
< label class = "md-search__overlay" for = "__search" > < / label >
< div class = "md-search__inner" role = "search" >
< form class = "md-search__form" name = "search" >
< input type = "text" class = "md-search__input" aria-label = "search" name = "query" placeholder = "Search" autocapitalize = "off" autocorrect = "off" autocomplete = "off" spellcheck = "false" data-md-component = "query" data-md-state = "active" >
< label class = "md-icon md-search__icon" for = "__search" > < / label >
< button type = "reset" class = "md-icon md-search__icon" data-md-component = "reset" tabindex = "-1" >

< / button >
< / form >
< div class = "md-search__output" >
< div class = "md-search__scrollwrap" data-md-scrollfix >
< div class = "md-search-result" data-md-component = "result" >
< div class = "md-search-result__meta" >
Type to start searching
< / div >
< ol class = "md-search-result__list" > < / ol >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< / div >
2020-02-23 18:49:35 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< / div >
< / div >
< / div >
< / div >
< / nav >
< / header >
2020-02-23 18:49:35 +01:00
2020-04-01 03:37:22 +02:00
< div class = "md-container" >
< main class = "md-main" role = "main" >
< div class = "md-main__inner md-grid" data-md-component = "container" >
2020-02-23 18:49:35 +01:00
2020-04-01 03:37:22 +02:00
< div class = "md-sidebar md-sidebar--primary" data-md-component = "navigation" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--primary" data-md-level = "0" >
< label class = "md-nav__title md-nav__title--site" for = "__drawer" >
< a href = ".." title = "IXWebSocket" class = "md-nav__button md-logo" >
< i class = "md-icon" > < / i >
< / a >
IXWebSocket
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = ".." title = "Home" class = "md-nav__link" >
Home
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../CHANGELOG/" title = "Changelog" class = "md-nav__link" >
Changelog
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../build/" title = "Build" class = "md-nav__link" >
Build
< / a >
< / li >
< li class = "md-nav__item md-nav__item--active" >
< input class = "md-toggle md-nav__toggle" data-md-toggle = "toc" type = "checkbox" id = "__toc" >
< label class = "md-nav__link md-nav__link--active" for = "__toc" >
Cobra
< / label >
< a href = "./" title = "Cobra" class = "md-nav__link md-nav__link--active" >
Cobra
< / a >
< nav class = "md-nav md-nav--secondary" >
< label class = "md-nav__title" for = "__toc" > Table of contents< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#general" class = "md-nav__link" >
General
< / a >
< nav class = "md-nav" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#server" class = "md-nav__link" >
Server
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#publisher" class = "md-nav__link" >
Publisher
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#subscriber" class = "md-nav__link" >
Subscriber
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../design/" title = "Design" class = "md-nav__link" >
Design
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../packages/" title = "Packages" class = "md-nav__link" >
Packages
< / a >
< / li >
2019-11-27 18:10:09 +01:00
2020-04-01 03:37:22 +02:00
< li class = "md-nav__item" >
< a href = "../usage/" title = "Examples" class = "md-nav__link" >
Examples
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../ws/" title = "Ws" class = "md-nav__link" >
Ws
< / a >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-sidebar md-sidebar--secondary" data-md-component = "toc" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--secondary" >
< label class = "md-nav__title" for = "__toc" > Table of contents< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#general" class = "md-nav__link" >
General
< / a >
< nav class = "md-nav" >
< ul class = "md-nav__list" >
< li class = "md-nav__item" >
< a href = "#server" class = "md-nav__link" >
Server
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#publisher" class = "md-nav__link" >
Publisher
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#subscriber" class = "md-nav__link" >
Subscriber
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-content" >
< article class = "md-content__inner md-typeset" >
< h1 > Cobra< / h1 >
< h2 id = "general" > General< / h2 >
2019-11-27 18:28:23 +01:00
< p > < a href = "https://github.com/machinezone/cobra" > cobra< / a > is a real time messaging server. The < code > ws< / code > utility can run a cobra server (named snake), and has client to publish and subscribe to a cobra server.< / p >
2019-11-27 18:10:09 +01:00
< p > Bring up 3 terminals and run a server, a publisher and a subscriber in each one. As you publish data you should see it being received by the subscriber. You can run < code > redis-cli MONITOR< / code > too to see how redis is being used.< / p >
< h3 id = "server" > Server< / h3 >
< p > You will need to have a redis server running locally. To run the server:< / p >
2019-12-03 18:28:36 +01:00
< pre > < code class = "bash" > $ cd < ixwebsocket-top-level-folder> /ixsnake/ixsnake
2019-11-27 18:10:09 +01:00
$ ws snake
{
" apps" : {
" FC2F10139A2BAc53BB72D9db967b024f" : {
" roles" : {
" _sub" : {
" secret" : " 66B1dA3ED5fA074EB5AE84Dd8CE3b5ba"
},
" _pub" : {
" secret" : " 1c04DB8fFe76A4EeFE3E318C72d771db"
}
}
}
}
}
redis host: 127.0.0.1
redis password:
redis port: 6379
< / code > < / pre >
< h3 id = "publisher" > Publisher< / h3 >
2019-12-03 18:28:36 +01:00
< pre > < code class = "bash" > $ cd < ixwebsocket-top-level-folder> /ws
2019-11-27 18:25:07 +01:00
$ ws cobra_publish --appkey FC2F10139A2BAc53BB72D9db967b024f --endpoint ws://127.0.0.1:8008 --rolename _pub --rolesecret 1c04DB8fFe76A4EeFE3E318C72d771db test_channel cobraMetricsSample.json
2019-11-27 18:10:09 +01:00
[2019-11-27 09:06:12.980] [info] Publisher connected
[2019-11-27 09:06:12.980] [info] Connection: Upgrade
[2019-11-27 09:06:12.980] [info] Sec-WebSocket-Accept: zTtQKMKbvwjdivURplYXwCVUCWM=
[2019-11-27 09:06:12.980] [info] Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15; client_max_window_bits=15
[2019-11-27 09:06:12.980] [info] Server: ixwebsocket/7.4.0 macos ssl/DarwinSSL zlib 1.2.11
[2019-11-27 09:06:12.980] [info] Upgrade: websocket
[2019-11-27 09:06:12.982] [info] Publisher authenticated
[2019-11-27 09:06:12.982] [info] Published msg 3
[2019-11-27 09:06:12.982] [info] Published message id 3 acked
< / code > < / pre >
< h3 id = "subscriber" > Subscriber< / h3 >
2019-12-03 18:28:36 +01:00
< pre > < code class = "bash" > $ ws cobra_subscribe --appkey FC2F10139A2BAc53BB72D9db967b024f --endpoint ws://127.0.0.1:8008 --rolename _pub --rolesecret 1c04DB8fFe76A4EeFE3E318C72d771db test_channel
2019-11-27 18:10:09 +01:00
#messages 0 msg/s 0
[2019-11-27 09:07:39.341] [info] Subscriber connected
[2019-11-27 09:07:39.341] [info] Connection: Upgrade
[2019-11-27 09:07:39.341] [info] Sec-WebSocket-Accept: 9vkQWofz49qMCUlTSptCCwHWm+Q=
[2019-11-27 09:07:39.341] [info] Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15; client_max_window_bits=15
[2019-11-27 09:07:39.341] [info] Server: ixwebsocket/7.4.0 macos ssl/DarwinSSL zlib 1.2.11
[2019-11-27 09:07:39.341] [info] Upgrade: websocket
[2019-11-27 09:07:39.342] [info] Subscriber authenticated
[2019-11-27 09:07:39.345] [info] Subscriber: subscribed to channel test_channel
#messages 0 msg/s 0
#messages 0 msg/s 0
#messages 0 msg/s 0
{" baz" :123," foo" :" bar" }
#messages 1 msg/s 1
#messages 1 msg/s 0
#messages 1 msg/s 0
{" baz" :123," foo" :" bar" }
{" baz" :123," foo" :" bar" }
#messages 3 msg/s 2
#messages 3 msg/s 0
{" baz" :123," foo" :" bar" }
#messages 4 msg/s 1
^C
2020-04-01 03:37:22 +02:00
< / code > < / pre >
2019-11-27 18:10:09 +01:00
2020-04-01 03:37:22 +02:00
< / article >
< / div >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< / main >
< footer class = "md-footer" >
< div class = "md-footer-nav" >
< nav class = "md-footer-nav__inner md-grid" >
< a href = "../build/" title = "Build" class = "md-flex md-footer-nav__link md-footer-nav__link--prev" rel = "prev" >
< div class = "md-flex__cell md-flex__cell--shrink" >
< i class = "md-icon md-icon--arrow-back md-footer-nav__button" > < / i >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< div class = "md-flex__cell md-flex__cell--stretch md-footer-nav__title" >
< span class = "md-flex__ellipsis" >
< span class = "md-footer-nav__direction" >
Previous
< / span >
Build
< / span >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< / a >
< a href = "../design/" title = "Design" class = "md-flex md-footer-nav__link md-footer-nav__link--next" rel = "next" >
< div class = "md-flex__cell md-flex__cell--stretch md-footer-nav__title" >
< span class = "md-flex__ellipsis" >
< span class = "md-footer-nav__direction" >
Next
< / span >
Design
< / span >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< div class = "md-flex__cell md-flex__cell--shrink" >
< i class = "md-icon md-icon--arrow-forward md-footer-nav__button" > < / i >
< / div >
< / a >
< / nav >
2019-11-27 18:10:09 +01:00
< / div >
2020-04-01 03:37:22 +02:00
< div class = "md-footer-meta md-typeset" >
< div class = "md-footer-meta__inner md-grid" >
< div class = "md-footer-copyright" >
powered by
< a href = "https://www.mkdocs.org" target = "_blank" rel = "noopener" > MkDocs< / a >
and
< a href = "https://squidfunk.github.io/mkdocs-material/" target = "_blank" rel = "noopener" >
Material for MkDocs< / a >
< / div >
< / div >
< / div >
< / footer >
< / div >
< script src = "../assets/javascripts/application.c33a9706.js" > < / script >
< script > app . initialize ( { version : "1.1" , url : { base : ".." } } ) < / script >
< / body >
< / html >