前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Golang语言编写echo程序

使用Golang语言编写echo程序

作者头像
李海彬
发布2018-03-26 14:22:18
1.2K0
发布2018-03-26 14:22:18
举报
文章被收录于专栏:Golang语言社区

网络教程的echo程序,在server断开链接的时候,会出现卡死的情况,如何防止这样的问题出现呢?

我自己优化了一把,异步的echo程序,在client端进行容错判断,在server重启的时候能够进行重新链接。

啥也不说了,上代码。

代码语言:javascript
复制
//server.go 
package main

import (
 "bufio"
 "fmt"
 "net"
)

func Echo(c net.Conn) {
    defer c.Close()
 for {
        line, err := bufio.NewReader(c).ReadString('\n')
 if err != nil {
            fmt.Printf("Failure to read:%s\n", err.Error())
 return
        }
        _, err = c.Write([]byte(line))
 if err != nil {
            fmt.Printf("Failure to write: %s\n", err.Error())
 return
        }
    }
}

func main() {
    fmt.Printf("Server is ready...\n")
    l, err := net.Listen("tcp", ":8053")
 if err != nil {
        fmt.Printf("Failure to listen: %s\n", err.Error())
    }

 for {
 if c, err := l.Accept(); err == nil {
            go Echo(c) //new thread
        }
    }
}

 //client.go

package main

import (
 "bufio"
 "fmt"
 "net"
 "os"
 "time"
)

type Clienter struct {
    client  net.Conn
    isAlive bool
    SendStr chan string
    RecvStr chan string
}

func (c *Clienter) Connect() bool {
 if c.isAlive {
 return true
    } else {
 var err error
        c.client, err = net.Dial("tcp", "127.0.0.1:8053")
 if err != nil {
            fmt.Printf("Failure to connet:%s\n", err.Error())
 return false
        }
        c.isAlive = true
    }
 return true
}

func (c *Clienter) Echo() {
    line := <-c.SendStr
    c.client.Write([]byte(line))
    buf := make([]byte, 1024)
    n, err := c.client.Read(buf)
 if err != nil {
        c.RecvStr <- string("Server close...")
        c.client.Close()
        c.isAlive = false
 return
    }
    time.Sleep(1 * time.Second)
    c.RecvStr <- string(buf[0:n])
}

func Work(tc *Clienter) {
 if !tc.isAlive {
 if tc.Connect() {
            tc.Echo()
        } else {
            <-tc.SendStr
            tc.RecvStr <- string("Server close...")
        }
    } else {
        tc.Echo()
    }
}
func main() {
 //defer client.Close()
 var tc Clienter
    tc.SendStr = make(chan string)
    tc.RecvStr = make(chan string)
 if !tc.Connect() {
 return
    }
    r := bufio.NewReader(os.Stdin)
 for {
 switch line, ok := r.ReadString('\n'); true {
 case ok != nil:
            fmt.Printf("bye bye!\n")
 return
 default:
            go Work(&tc)
            tc.SendStr <- line
            s := <-tc.RecvStr
            fmt.Printf("back:%s\n", s)
        }
    }
} 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档