Golang: TCP 简单并发服务器

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

内容简介:一个简单的多协程并发服务器,客户端从标准输入读取内容,服务器处理后返回。专栏的介绍可以参考《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 简单并发服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

离散数学及其应用

离散数学及其应用

Kenneth H.Rosen / 机械工业出版社 / 2012-11 / 99.00元

本书是介绍离散数学理论和方法的经典教材,已经成为采用率最高的离散数学教材,被美国众多名校用作教材,获得了极大的成功。中文版也已被国内大学广泛采用为教材。作者参考使用教师和学生的反馈,并结合自身对教育的洞察,对第7版做了大量的改进,使其成为更有效的教学工具。. 本书可作为1至2个学期的离散数学课入门教材,适用于数学,计算机科学。计算机工程.信息技术等专业的学生。 本书特点 实例:书中有8......一起来看看 《离散数学及其应用》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具