2012-11-25 2 views
3

서버가 실행될 때까지 대기하는 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

죄송합니다. 서버 시작 전 클라이언트가 "패닉 : 런타임 오류 : 잘못된 메모리 주소 또는 nil 포인터 참조 해제"오류가 발생하는 경우 –

+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

관련 문제