connection closing

master
Jordan Orelli 4 years ago
parent 9abaf5a252
commit 950aeda87e

@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"fmt" "fmt"
"net/url" "net/url"
"strings" "strings"
@ -16,7 +17,7 @@ type client struct {
port int port int
} }
func (c *client) run() { func (c *client) run(ctx context.Context) {
dialer := websocket.Dialer{ dialer := websocket.Dialer{
HandshakeTimeout: 3 * time.Second, HandshakeTimeout: 3 * time.Second,
ReadBufferSize: 32 * 1024, ReadBufferSize: 32 * 1024,
@ -41,15 +42,32 @@ func (c *client) run() {
c.Debug("dial response header: %s = %s", k, strings.Join(vals, ",")) c.Debug("dial response header: %s = %s", k, strings.Join(vals, ","))
} }
tick := time.NewTicker(time.Second)
defer tick.Stop()
for { for {
w, err := conn.NextWriter(websocket.TextMessage) select {
if err != nil { case <-tick.C:
c.Error("unable to get a websocket frame writer: %v", err) w, err := conn.NextWriter(websocket.TextMessage)
break if err != nil {
} c.Error("unable to get a websocket frame writer: %v", err)
break
}
w.Write([]byte("hey")) w.Write([]byte("hey"))
w.Close() w.Close()
time.Sleep(time.Second) case <-ctx.Done():
c.Info("parent context done, sending close message")
msg := websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")
if err := conn.WriteMessage(websocket.CloseMessage, msg); err != nil {
c.Error("failed to write close message: %v", err)
}
c.Info("closing connection")
if err := conn.Close(); err != nil {
c.Error("failed to close connection: %v", err)
}
c.Info("connection closed")
return
}
} }
} }

18
ui.go

@ -1,6 +1,9 @@
package main package main
import ( import (
"context"
"time"
"github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2"
"github.com/jordanorelli/belt-mud/internal/exit" "github.com/jordanorelli/belt-mud/internal/exit"
"github.com/jordanorelli/blammo" "github.com/jordanorelli/blammo"
@ -11,15 +14,25 @@ type ui struct {
*blammo.Log *blammo.Log
screen tcell.Screen screen tcell.Screen
mode uiMode mode uiMode
client *client
} }
func (ui *ui) run() { func (ui *ui) run() {
c := client{ ui.client = &client{
Log: ui.Child("client"), Log: ui.Child("client"),
host: "127.0.0.1", host: "127.0.0.1",
port: 12805, port: 12805,
} }
go c.run() ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer func() {
ui.Debug("canceling client context")
cancel()
time.Sleep(time.Second)
}()
go ui.client.run(ctx)
screen, err := tcell.NewScreen() screen, err := tcell.NewScreen()
if err != nil { if err != nil {
@ -90,7 +103,6 @@ func (ui *ui) menu() {
} }
ui.mode.HandleEvent(e) ui.mode.HandleEvent(e)
ui.screen.Clear() ui.screen.Clear()
ui.mode.draw(ui) ui.mode.draw(ui)
ui.screen.Show() ui.screen.Show()

Loading…
Cancel
Save