summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/client/client.go42
1 files changed, 27 insertions, 15 deletions
diff --git a/client/client/client.go b/client/client/client.go
index 7c9cf03..0c563bf 100644
--- a/client/client/client.go
+++ b/client/client/client.go
@@ -45,19 +45,18 @@ func New(address string) Client {
}
func (c *Client) RunClient() {
- sleep := time.Second / 4
+ reconnectWait := time.Second / 4
for {
- conn, err := net.Dial("tcp", c.Address)
+ conn, err := net.DialTimeout("tcp", c.Address, 30 * time.Second)
if err != nil {
c.message <- Message {func(mh MessageHandler) {
mh.OnDisconnect(err)
}}
- time.Sleep(sleep)
- sleep = min(sleep * 2, 30 * time.Second)
+ time.Sleep(reconnectWait)
+ reconnectWait = min(reconnectWait * 2, 30 * time.Second)
continue
}
defer conn.Close()
- sleep = time.Second / time.Duration(2 + rand.Int() % 4)
recv, recvErr := proto.ReadLines(bufio.NewReader(conn))
send := make(chan proto.Line, 1)
@@ -88,11 +87,10 @@ func (c *Client) RunClient() {
}()
defer close(c.send)
- c.message <- Message {func(mh MessageHandler) {
- mh.OnConnect()
- }}
-
- var debugger Debugger
+ var (
+ debugger Debugger
+ connected bool
+ )
run: for {
select {
case line := <-recv:
@@ -101,6 +99,18 @@ func (c *Client) RunClient() {
debugger.OnLine(line, false)
}}
}
+
+ if !connected {
+ if line.Kind == '*' && line.Cmd.Kind == "hi" {
+ c.message <- Message {func(mh MessageHandler) {
+ mh.OnConnect()
+ }}
+ reconnectWait =
+ time.Second / time.Duration(2 + rand.Int() % 4)
+ connected = true
+ }
+ }
+
switch line.Kind {
case '*':
c.message <- Message {func(mh MessageHandler) {
@@ -130,11 +140,13 @@ func (c *Client) RunClient() {
return
}
}
- c.message <- Message {func(mh MessageHandler) {
- mh.OnDisconnect(err)
- }}
- time.Sleep(sleep)
- sleep = min(sleep * 2, 30 * time.Second)
+ if connected {
+ c.message <- Message {func(mh MessageHandler) {
+ mh.OnDisconnect(err)
+ }}
+ }
+ time.Sleep(reconnectWait)
+ reconnectWait = min(reconnectWait * 2, 30 * time.Second)
}
}