• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

   1  package main
   2   
   3  import (
   4  	"net"
   5  	"sync"
   6  	"encoding/json"
   7  )
   8   
   9  func
  10  main() {
  11  
  12  	connections := map[ net.Conn ] interface{} {}
  13  	mutex := sync.RWMutex{}
  14  
  15  	broadcaster := make( chan interface{} )
  16  	go func() {
  17  		for {
  18  			data, _ := json.Marshal( <- broadcaster )
  19  			mutex.RLock()
  20  			conns := connections
  21  			mutex.RUnlock()
  22  			for conn, _ := range conns { conn.Write( data ) }
  23  		}
  24  	}()
  25  
  26  	listener, _ := net.Listen( "tcp", ":6666" )
  27  	defer listener.Close()
  28  	for {
  29  		conn, _ := listener.Accept()
  30  		mutex.Lock()
  31  		connections[ conn ] = ""
  32  		mutex.Unlock()
  33  		go func() {
  34  			decoder := json.NewDecoder( conn )
  35  			for {
  36  				var	w interface{}
  37  				err := decoder.Decode( &w )
  38  				if err != nil { break }
  39  				broadcaster <- w
  40  			}
  41  			mutex.Lock()
  42  			delete( connections, conn )
  43  			mutex.Unlock()
  44  			conn.Close()
  45  		}()
  46  	}
  47  }

posted by Face Saturn on Wed 24 Dec 2014 at 22:07

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry2378
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ