diff --git a/client/Start.go b/client/Start.go new file mode 100644 index 0000000..3be3b12 --- /dev/null +++ b/client/Start.go @@ -0,0 +1,72 @@ +package client + +import ( + "log" + "net/url" + "os" + "os/signal" + "strconv" + "time" + + "github.com/gorilla/websocket" +) + +func (client *Client) Start() { + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + u := url.URL{Scheme: "ws", Host: client.ServerAddress + ":" + strconv.Itoa(client.ServerPort), Path: "/ws"} + log.Printf("connecting to %s", u.String()) + + c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + if err != nil { + log.Fatal("dial:", err) + } + defer c.Close() + + done := make(chan struct{}) + + go func() { + defer close(done) + for { + _, message, err := c.ReadMessage() + if err != nil { + log.Println("read:", err) + return + } + log.Printf("recv: %s", message) + } + }() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + select { + case <-done: + return + case t := <-ticker.C: + err := c.WriteMessage(websocket.TextMessage, []byte(t.String())) + if err != nil { + log.Println("write:", err) + return + } + case <-interrupt: + log.Println("interrupt") + + // Cleanly close the connection by sending a close message and then + // waiting (with timeout) for the server to close the connection. + err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) + if err != nil { + log.Println("write close:", err) + return + } + select { + case <-done: + case <-time.After(time.Second): + } + return + } + } + +} diff --git a/client/types.go b/client/types.go index 2571379..558a8d4 100644 --- a/client/types.go +++ b/client/types.go @@ -1,6 +1,6 @@ package client type Client struct { - serverAddress string - serverPort int + ServerAddress string + ServerPort int } diff --git a/main.go b/main.go index c9e5cb9..0b7a838 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "gitea.ligthert.net/golang/sfcs/client" "gitea.ligthert.net/golang/sfcs/flags" "gitea.ligthert.net/golang/sfcs/server" "gitea.ligthert.net/golang/sfcs/vars" @@ -28,7 +29,8 @@ func main() { server := server.Server{ListenAddress: vars.Address, ListenPort: vars.Port} vars.Operator = &server case "agent": - // operator := client.Client{} + client := client.Client{ServerAddress: vars.Address, ServerPort: vars.Port} + vars.Operator = &client } vars.Operator.Start() diff --git a/server/Start.go b/server/Start.go index 1f45dc4..3a15fff 100644 --- a/server/Start.go +++ b/server/Start.go @@ -9,16 +9,14 @@ import ( "github.com/gorilla/websocket" ) -func (server *Server) Start() error { +func (server *Server) Start() { // Start the server http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { handleConnections(w, r) }) log.Fatal(http.ListenAndServe(server.ListenAddress+":"+strconv.Itoa(server.ListenPort), nil)) - time.Sleep(600 * time.Second) - - return nil + // return nil } var upgrader = websocket.Upgrader{ diff --git a/vars/types.go b/vars/types.go index da9e562..7e554a7 100644 --- a/vars/types.go +++ b/vars/types.go @@ -4,7 +4,7 @@ import "gitea.ligthert.net/golang/sudoku-funpark/outputter" type Operator interface { // Start the operator - Start() error + Start() } type Vars struct {