2015-12-27 32 views
0

我創建了一個全局通道,並且在ExampleNewWatcher內發生新事件時向它發送消息。第一次發生事件時,該消息正在通道的接收端收到。但是,第二次發生事件時,我沒有在頻道的接收端收到消息。只能在通道上接收一條消息

var messages = make(chan string) 
func ExampleNewWatcher(){ 
    watcher, err := fsnotify.NewWatcher() 
    if err != nil{ 
    log.Fatal(err) 
    } 
    defer watcher.Close(0 
    done := make(chan bool) 
    go func(){ 
    for { 
     select{ 
      case event := <- watcher.Events: 
       if event.Op&fsnotify.Write == fsnotify.Write{ 
       log.Println("this logs twice if I create two write events") 
       messages <- "this message only gets sent once even if I create two events" 
       } 
      case err := <- watcher.Errors: 
       log.Println("error", err) 
     } 

    } 
    }() 
    err = watcher.Add("/tmp/watchedfile") 
    <-done 
} 
func Websock(ws *websocket.Conn){ 
    msg := <-messages 
    log.Println("only one message arrives, even if I create for two events", msg) 
    err := websocket.Message.Send(ws, msg) 

} 
func main(){ 
go ExampleNewWatcher() //for some reason, the server doesn't run unless I prefix a go routine to this watcher function, but that's another issue ... 

    http.Handle("/websock", websocket.Handler(Websock)) 
log.Fatal(http.ListenAndServe(":8000", nil)) 

} 
+1

如何調用'waitForMessage'?在你的發佈代碼中,你根本不會調用它。 –

+0

@PaulHankin我更新了OP,以顯示如何調用waitForMessage(即它是websocket處理程序)。請注意,我在編輯的代碼中更改了func的名稱 – Leahcim

回答

2

您的WebSock函數需要包含一個接收循環來接收多條消息。否則,你的函數將終止並且websocket連接將被關閉。

0

@MickaëlRémond是對的。修改您的Websock功能,如:

func Websock(ws *websocket.Conn) { 
    for { 
     msg := <-messages 
     log.Println("only one message arrives, even if I create for two events", msg) 
     if err := websocket.Message.Send(ws, msg); err != nil { 
      log.Fatal(err) 
     } 
    } 
} 
相關問題