2012-11-25 340 views
3

我想創建一個等待服務器運行的websocket客戶端。如果連接被服務器關閉,它應該重新連接。如何讓websocket客戶端等待服務器正在運行?

我試過不工作,我的代碼將退出運行時錯誤:

panic: runtime error: invalid memory address or nil pointer dereference

func run() { 
    origin := "http://localhost:8080/" 
    url := "ws://localhost:8080/ws" 

    ws, err := websocket.Dial(url, "", origin) 

    if err != nil { 
     fmt.Println("Connection fails, is being re-connection") 
     main() 
    } 

    if _, err := ws.Write([]byte("something")); err != nil { 
    log.Fatal(err) 
    } 
} 
+1

「但它不工作」 - 爲什麼?它有什麼作用?你有沒有收到任何錯誤信息? –

+0

對不起,只要客戶端在服務器啓動前會出現錯誤「panic:運行時錯誤:無效的內存地址或零指針解除引用」 –

+1

該恐慌信息還包含行號,可能提供線索。但是,您一眼就可以調用main來重新啓動程序。 Main由運行時調用,您自己調用它無效。 – Sonia

回答

8

你的榜樣看起來像一個代碼段。很難說沒有看到所有的代碼,爲什麼你會得到這個錯誤。正如您在文章的評論中指出的那樣,您不能再從代碼中調用main(),並且包含恐慌報告中的行號也會有幫助。

通常將您的程序最小化到任何人都可以運行和重現錯誤的最小情況是獲得幫助的最快方式。我以這種方式爲你重建了你的。希望你可以用它來修復你自己的代碼。

package main 

import (
    "websocket" 
    "fmt" 
    "log" 
    "time" 
    ) 

func main() { 
    origin := "http://localhost:8080/" 
    url := "ws://localhost:8080/ws" 

    var err error 
    var ws *websocket.Conn 
    for { 
     ws, err = websocket.Dial(url, "", origin) 
     if err != nil { 
      fmt.Println("Connection fails, is being re-connection") 
      time.Sleep(1*time.Second) 
      continue 
     } 
     break 
    } 
    if _, err := ws.Write([]byte("something")); err != nil { 
     log.Fatal(err) 
    } 

} 

要運行它,只需將它複製到你的系統上稱爲main.go文件,然後運行:

go run main.go 
+0

謝謝你的時間,這就是我想要的 –

+1

@ linuz.ly然後你應該upvote並接受答案 – topskip

相關問題