【原】使用Golang語言編寫echo程序


網絡教程的echo程序,在server斷開鏈接的時候,會出現卡死的情況,如何防止這樣的問題出現呢?

我自己優化了一把,異步的echo程序,在client端進行容錯判斷,在server重啟的時候能夠進行重新鏈接。

啥也不說了,上代碼。 

 

//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([] byte1024)
    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)
        }
    }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM