Golang: TCP 简单并发服务器

栏目: Go · 发布时间: 6年前

内容简介:一个简单的多协程并发服务器,客户端从标准输入读取内容,服务器处理后返回。专栏的介绍可以参考《CaseGolang专栏》,代码可以看案例比较简单:客户端从标准输入读取内容发送给服务器,服务器处理之后返回给客户端。

一个简单的多协程并发服务器,客户端从标准输入读取内容,服务器处理后返回。

专栏的介绍可以参考《CaseGolang专栏》,代码可以看 《宝库-Case》

案例比较简单:客户端从标准输入读取内容发送给服务器,服务器处理之后返回给客户端。

(中间关于读写的时候,有些小细节要注意;不展开直接看代码吧)

直接贴代码:(server.go)

package main

import (
  "io"
  "strings"
  "fmt"
  "log"
  "net"
)

func main() {
  listener, err := net.Listen("tcp", "127.0.0.1:8000")
  if err != nil {
    log.Fatalln("err = ", err)
  }
  defer listener.Close()

  //并发接收多个请求
  for {
    conn, err := listener.Accept()
    if err != nil {
      log.Fatalln("err = ", err)
    }
    //为每一个连接开一个协程
    go HandleConn(conn)
  }
}

func HandleConn(conn net.Conn) {
  defer conn.Close()

  //获取对端地址
  addr := conn.RemoteAddr().String()
  fmt.Println(addr + "addr connect succeed")

  //读取用户请求
  buf := make([]byte, 1024*4)

  for {
    n, err := conn.Read(buf)
    if err != nil {
      if err != io.EOF {
        fmt.Println("err = ", err)
      }
      return
    }
    fmt.Println("read buf = ", string(buf[:n])) //查看读取到的内容

    conn.Write([]byte(strings.ToUpper(string(buf[:n])))) //转成大写返回给客户端
  }

}

然后 client.go

package main

import (
  "os"
  "fmt"
  "net"
)

/*直接发送内容*/
/* func main() {
  conn, err := net.Dial("tcp", "127.0.0.1:8000")
  if err != nil {
    fmt.Println("err = ", err)
    return
  }
  defer conn.Close()

  conn.Write([]byte("big")) //发送数据
} */

//从 os.Stdin读取内容,然后在发送

func main() {
  conn, err := net.Dial("tcp", "127.0.0.1:8000")
  if err != nil {
    fmt.Println("dial err : ", err)
    return
  }
  defer conn.Close()

  go func() {
    //从键盘设备文件读
    str := make([]byte, 1024)
    for {
      n, err := os.Stdin.Read(str)  //读取标准输入
      if err != nil {
        fmt.Println("os.Stdin, err = ", err)
        return
      }

      //把输入的内容给服务器发送
      conn.Write(str[:n]) //读多少写多少
    }

  }()

  //主协程负责死循环在这守着服务器的回写 
  //(好处是服务器关闭,这边儿可以退出; 否则放到子协程中读,主协程进行 stdin输出,
    //则即使读到服务器关闭的异常,程序也无法退出)
  buf := make([]byte, 1024)
  for {
    n, err := conn.Read(buf) //接收服务器的写回
    if err != nil {
      fmt.Println("read err = ", err)
      return
    }
    fmt.Println(string(buf[:n])) //打印服务器拿过来的数据
  }
}

不解释了,注意下 IO 的处理,还有一种方式,判断读取的字节数 n 。

运行大致如下:

Golang: TCP 简单并发服务器

Merlin 网络小案例 upload


以上所述就是小编给大家介绍的《Golang: TCP 简单并发服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Practice of Programming

The Practice of Programming

Brian W. Kernighan、Rob Pike / Addison-Wesley / 1999-2-14 / USD 49.99

With the same insight and authority that made their book The Unix Programming Environment a classic, Brian Kernighan and Rob Pike have written The Practice of Programming to help make individual progr......一起来看看 《The Practice of Programming》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具