diff --git a/ws-client/go.mod b/ws-client/go.mod new file mode 100644 index 0000000..3de883c --- /dev/null +++ b/ws-client/go.mod @@ -0,0 +1,5 @@ +module main + +go 1.22.4 + +require github.com/gorilla/websocket v1.5.3 diff --git a/ws-client/go.sum b/ws-client/go.sum new file mode 100644 index 0000000..25a9fc4 --- /dev/null +++ b/ws-client/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/ws-client/main.go b/ws-client/main.go new file mode 100644 index 0000000..b87a3a3 --- /dev/null +++ b/ws-client/main.go @@ -0,0 +1,76 @@ +package main + +import ( + "log" + "time" + + "github.com/gorilla/websocket" +) + +type WSConnection struct { + url string + conn *websocket.Conn + errChan chan error +} + +func (ws *WSConnection) readMessage() { + log.Printf("Reading messages") + for { + _, message, err := ws.conn.ReadMessage() + if err != nil { + ws.errChan <- err + return + } + log.Printf("Received: %s", message) + } +} + +func (ws *WSConnection) writeMessage(message string) { + err := ws.conn.WriteMessage(websocket.TextMessage, []byte(message)) + if err != nil { + log.Printf("Error during message writing: %v", err) + ws.errChan <- err + return + } +} + +func (ws *WSConnection) handleError() { + for { + err := <-ws.errChan + log.Println("Error during message reading:", err) + + time.Sleep(5 * time.Second) + ws.open() + } +} + +func (ws *WSConnection) open() { + log.Printf("Connecting to %s", ws.url) + conn, _, err := websocket.DefaultDialer.Dial(ws.url, nil) + if err != nil { + log.Println("Error during connection:", err) + ws.errChan <- err + return + } + log.Printf("Connected") + ws.conn = conn + ws.errChan = make(chan error) + go ws.readMessage() + go ws.handleError() +} + +func main() { + log.SetFlags(log.Lmicroseconds) + + wsConn := WSConnection{ + url: "ws://localhost:8080/ws", + } + wsConn.open() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for timestamp := range ticker.C { + wsConn.writeMessage(timestamp.String()) + } +} diff --git a/ws-server/main.go b/ws-server/main.go index 29361da..86fbd5f 100644 --- a/ws-server/main.go +++ b/ws-server/main.go @@ -2,10 +2,48 @@ package main import ( "fmt" + "log" + "net/http" "github.com/gorilla/websocket" ) +var upgrader = websocket.Upgrader{} + +// upgrader.CheckOrigin = func(r *http.Request) bool { return true } + +func wsHandler(responseWriter http.ResponseWriter, request *http.Request) { + conn, err := upgrader.Upgrade(responseWriter, request, nil) + if err != nil { + fmt.Println("Error during connection upgrade:", err) + return + } + defer conn.Close() + + for { + messageType, packet, err := conn.ReadMessage() + + if err != nil { + fmt.Println("Error during message reading:", err) + break + } + log.Printf("Received: %v %s", messageType, packet) + + // err = conn.WriteMessage(messageType, packet) + // if err != nil { + // fmt.Println("Error during message writing:", err) + // break + // } + } +} + func main() { - fmt.Println("Hello, World!") -} \ No newline at end of file + log.SetFlags(log.Lmicroseconds) + + http.HandleFunc("/ws", wsHandler) + log.Println("Server starting on :8080") + err := http.ListenAndServe(":8080", nil) + if err != nil { + log.Println("Error starting server:", err) + } +}