// Teambition


socket.io 

协作应用:(要求很好的同步性,reload,稳定性要高,要前后端剥离)

1、信息不能出现不对称,实时同步应用

2、讨论有明确的上下文,能够针对特定对象更新数据

3、应用能够持续运行,缓存必要数据根据网络情况进行必要操作


Server -> App (多个)


Socket.io

1、旨在在不用版本的浏览器(包括移动设别浏览器在内)间实现实时通信

2、在多种传输方式中自动选择最优方式

3、100% JavaScript 


传输方式:(性能从强到弱)   // http://socket.io/#browser-support

WebSocket

Adobe Flash Socket

AJAX long polling

AJAX multipart streaming

Forever iframe

JSONP Polling


安装socket

$npm install socket.io
app = require('http').createServer( handler )
io = require('socket.io').listen( app )
fs = require('fs')
app.listen(80)
io.socket.on 'connection',(socket) -> ...



前端的类:

<script src="/socket.io/socket.io.js"></script>
socket = io.connect('http://localhost')
socket.on 'eventName',(data)->...



接口:

1、发送事件

socket.emit 'eventName',{data}


2、响应事件

socket.on 'eventName',(data)->...


客户端发起请求

cid = (new Data).getValue()
socket.emit 'eventName',{
cid:cid
...
}
socket.once "eventName#{cid}",(data)->...



搭建MV*应用

Backbone                 // http://backbonejs.org

TodoMVC// http://todomvc.com


以Backbone框架为例

实时更新前端数据 

class NewModel extends Backbone.Model
initialize: ->
    @listen() if @id
    ...
listen: ->
    socket.on ":change:#{@id}",(changes) =>//change事件
    @set(changes)
    ...



根据数据变化更新视图

class NewModel extends Backbone.Model
initialize: (model) ->
    @model = model
    @render()
    @listen() if @model.id
    ...
listen: ->
    @listenTo(@model,'change',@render)
    ...
render: ->
    @$el.html(Template(@model.toJSON()))
    ...



网络状况处理

SOCKET.connect host,{]}



例子:

SOCKET.connect = (host, option) ->
    unless host and window.io and (typeof window.io.connect is 'funciton')
        return false
    _connect = =>
        @socket.once("#{@eventName}.connect"),(response) =>
            return @onError(response.error) if response.error
            @connectCount++
            if @connectCount is 1
                return @option.onConnect(response.data)
            else
                return @option.onReconnect(response.data)
        )
    _disconnect = =>
        return @option.onDisconnect()
    @options = _.extend(@options, options)
    @eventName = @options.eventName if @options.eventName
    @socket = window.io.connect(host)
    @socket.on('connect', _connect)
    @socket.on('disconnect', _disconnect)
    @socket.on('error', (err) => @options.onError(err))



了解更多// github.com/teambition/socket.io-hub

使用Room和Broadcase来简化多客户端同步

socket.io的性能瓶颈主要在并发消息数量

通过运行多个服务器实例来提高承载能力

使用YO进行框架搭建

使用RequireJS进行包管理

使用Grunt进行任务管理