GoServe服务器入门

Tcp服务器

服务器端server.go:

一个(web)服务器(net)应用需要响应众多客户端的并发请求:go会为每一个客户端产生一个协程(go)用来处理请求。我们需要使用net包中网络通信的功能。它包含了用于TCP/IP以及UDP协议、域名解析等方法。

1.在main()创建一个net.Listener的变量,这是服务器的基本函数:用来监听和接收来自客户端的请求(来自localhost即IP地址为127.0.0.1端口为50000基于TCP协议)这个Listen()函数可以返回一个error类型的错误变量---------

2.用无线循环Listen.Accept()来等待客服端请求

3.客服端的请求将产生一个net.Conn类型的连续变量。然后一个独立的携程使用这个连续执行都ServerStuff(),开始使用一个512字节的缓冲data来读取客服端发送来的数据并且打印到服务器的终端

4.当客服端发送的所有数据都被读取完了的时,携程就结束了。

package main

import (
    "fmt"
    "net"
)

func main() {
    fmt.Println("Starting the server ...")
    // 创建 listener
    listener, err := net.Listen("tcp", "localhost:50000")
    if err != nil {
        fmt.Println("Error listening", err.Error())
        return //终止程序
    }
    // 监听并接受来自客户端的连接
    for {
        conn, err := listener.Accept()// 监听并且返回一个Conn接口
        if err != nil {
            fmt.Println("Error accepting", err.Error())
            return // 终止程序
        }
        go doServerStuff(conn)//将Conn接口传入携程函数处理客服端信息
    }
}

func doServerStuff(conn net.Conn) {
    for {
		buf := make([]byte, 512)//512字节的缓存
		
        _, err := conn.Read(buf)//将Conn连接特点客服端的接口读取到的客服端内容保存到buf中
        if err != nil {
            fmt.Println("Error reading", err.Error())
            return //终止程序
        }
        fmt.Printf("Received data: %v", string(buf))//输出buf的内容  %v相应值的默认格式。Printf("%v", people) {zhangsan},
    }
}

客服端client.go:

1.通过net.Dial创建了一个和服务器之间的连接,---------在网络编程中net.Dial函数是非常重要的,一旦你连接到远程系统,就会返回一个Conn类型接口,我们可以用它发送和接收数据。Dial函数巧妙的抽象了网络结构及传输,所以IPv4或IPv6或TCP或UDP都可以使用这个接口

2.它通过无限循环中的os.Stdin接收来自键盘的输入直到输入“Q"。(注意 \r 和 \n 换行符分割字符串【在Windows平台下使用 \r\n】)

3.接下来分割后的输入通过 connection 的Write 方法被发送到服务器。(服务器必须先启动好)

4.在windows中可通过Ctrl + C停止程序

代码:

package main

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

func main() {
    //打开连接:
    conn, err := net.Dial("tcp", "localhost:50000")
    if err != nil {
        //由于目标计算机积极拒绝而无法创建连接
        fmt.Println("Error dialing", err.Error())
        return // 终止程序
    }

    inputReader := bufio.NewReader(os.Stdin)
    fmt.Println("First, what is your name?")
    clientName, _ := inputReader.ReadString('\n')
    // fmt.Printf("CLIENTNAME %s", clientName)
    trimmedClient := strings.Trim(clientName, "\r\n") // Windows 平台下用 "\r\n"
    // 给服务器发送信息直到程序退出:
    for {
        fmt.Println("What to send to the server? Type Q to quit.")
        input, _ := inputReader.ReadString('\n')
        trimmedInput := strings.Trim(input, "\r\n")
        // fmt.Printf("input:--s%--", input)
        // fmt.Printf("trimmedInput:--s%--", trimmedInput)
        if trimmedInput == "Q" {
            return
        }
        _, err = conn.Write([]byte(trimmedClient + " says: " + trimmedInput))
    }
}

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值