培训首页  >  web前端新闻  >  兄弟连分享简单编写Echo Server

兄弟连分享简单编写Echo Server

[2018-08-24 14:55:39] 浏览量:61 来源:

北京兄弟连IT

  所有的新技术都经历了一些成长的痛苦,区块链技术也一样。但是,尽管它还处于发展的早期阶段,但它具有改进许多行业、许多应用和系统的巨大潜力。

 

  Go语言具有其关键特性。Go语言之所以如此强大,是因为它在服务端的开发中总能抓住程序员的痛痒需求,用直接、简单、、稳定的方式来解决并实现问题。

 

今天来一个简单的内容,用golang写一个简单的echo server

 

TCP/IP协议

大家都知道TCP/IP协议簇是当今网络世界的事实标准协议,与其对应的是OSI的七层模型,对于这七层模型这里就不再赘述了,这里只是简单介绍一下TCP/IP的四层模型。

 

TCP/IP的四层模型最下面是一个物理层,上面是网络层,再往上就是传输层,最后是应用层了,分层的概念相信大家都之的,这样在不同层之间变化就是打包或者解包,简单来说就是加上头信息或者去掉头信息。

 

golang API

golangnet包里面有很方便的API供我们使用,这个API主要可以划分成Addr,Listen,Connection,DialerIP和其他的一些网络API,例如DNS API等,这里就不介绍其他的网络API(主要是自己也没有研究_)。

 

Addr主要有IPAddr,TCPAddr,UDPAddrUnixAddr,主要就是不同的地址,这是网络编程的基础,没有地址就像写信不附地址,根本寄不到啊!

 

Listener主要就是TCPListener,UnixListener(咦,为什么没有UDPListener呢?),Listener是一般是服务端需要调用的,因为服务端需要监-听客户端呀,时刻看着Y的来不来跟我打招呼啊。

 

Connection就是连接吗,它就是两个节点沟通的桥梁啊,没有它你就跟你对象搭不上话啊。

 

Dialer就是请求者啊,当服务端准备好了之后,客户端就可以Dial一下了,如果顺利的话就可以拿到一个Connection,这样的话就可以跟另一端的人搭上话了。

 

简单的Echo Server

好了,现在用一个Echo Server来简单的展示一下如何使用TCP来进行网络通信,当然你也可以用UDP

 

Server

   package main

 

   import (

     "net"

     "os"

     "fmt"

     "io"

   )

 

  const BUFF_SIZE = 1024

  var buff = make([]byte,BUFF_SIZE)

 

  // 接受一个TCPConn处理内容

  func handleConn(tcpConn *net.TCPConn){

    if tcpConn == nil {

      return

    }

    for {

      n,err := tcpConn.Read(buff)

      if err == io.EOF {

        fmt.Printf("The RemoteAddr:%s is closed!\n",tcpConn.RemoteAddr().String())

        return

      }

      handleError(err)

      if string(buff[:n]) == "exit" {

        fmt.Printf("The client:%s has exited\n",tcpConn.RemoteAddr().String())

      }

      if n > 0 {

        fmt.Printf("Read:%s",string(buff[:n]))

      }

    }

  }

  // 错误处理

  func handleError(err error) {

    if err == nil {

      return

    }

    fmt.Printf("error:%s\n",err.Error())

  }

 

  func main() {

    if len(os.Args) != 2 {

      fmt.Println("Usage:

      return

    }

    port := os.Args[1]

    tcpAddr,err := net.ResolveTCPAddr("tcp4","localhost:"+port)

    handleError(err)

    tcpListener,err := net.ListenTCP("tcp4",tcpAddr)  //

    handleError(err)

    defer tcpListener.Close()

    for {

      tcpConn,err := tcpListener.AcceptTCP()

      fmt.Printf("The client:%s has connected!\n",tcpConn.RemoteAddr().String())

      handleError(err)

      defer tcpConn.Close()

      go handleConn(tcpConn)    //起一个goroutine处理

    }

  }

 

Client

  package main

 

  import (

    "net"

    "fmt"

    "os"

    "bufio"

  )

 

  const BUFF_SIZE = 1024

  var input = make([]byte,BUFF_SIZE)

 

  func handleError(err error) {

    if err == nil {

      return

    }

    fmt.Printf("error:%s\n",err.Error())

  }

 

  func main() {

    if len(os.Args) != 2 {

      fmt.Println("Usage:

      return

    }

    port := os.Args[1]

    tcpAddr,err := net.ResolveTCPAddr("tcp4","localhost:"+port)

    handleError(err)

    tcpConn,err := net.DialTCP("tcp4",nil,tcpAddr)

    handleError(err)

    reader :=  bufio.NewReader(os.Stdin)

    var continued = true

    var inputStr string

    for continued {

      n,err := reader.Read(input)

      handleError(err)

      if n > 0 {

        k,_ := tcpConn.Write(input[:n])

        if k > 0 {

          inputStr = string(input[:k])

          fmt.Printf("Write:%s",inputStr)

          if inputStr == "exit\n" {  //在比对时由于有个回车符,所以加上\n

            continued = false        //也可以将inputStr = TrimRight(inputStr,"\n")

          }

        }

      }

    }

  }

 

高能预警,兄弟连教育区块链直播课程8月持续火爆来袭!

原价1188元的12节区块链进阶课程,现仅需1元!

还可取《Go语言基础实战项目开发》与《Go语言实战项目开发》教材两本!!

限量!!先到先得!!

http://www.ydma.cn/open/course/24


 


文中图片素材来源网络,如有侵权请联系删除
  • 软件开发
  • 软件测试
  • 数据库
  • Web前端
  • 大数据
  • 人工智能
  • 零基础
  • 有HTML基础
  • 有PHP基础
  • 有C语言基础
  • 有JAVA基础
  • 其他计算机语言基础
  • 周末班
  • 全日制白班
  • 随到随学

网上报名

热门信息