一、概述

上一篇介绍了基本的函数和结构类型,这里就可以开始写服务端和客户端通信小程序了。

如果服务端使用Listen 来监听,那么可以不用ResolveTCPAddr 函数。

现在我们就来写一个server和client,实现功能:client发送数据到server,server将数据转成大写后返回。

二、服务端实现

package main
import (
    "net"
    "fmt"
    "strings"
)
func main(){
    tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //创建一个TCPAddr
    if err != nil{
        fmt.Println(err)
        return
    }
    tcpLinstener, err := net.ListenTCP("tcp4", tcpAddr) //开始监听
    if err != nil{
        fmt.Println(err)
        return
    }
    fmt.Printf("Start listen:[%s]", tcpAddr)
    tcpCoon, err := tcpLinstener.AcceptTCP()  //阻塞,等待客户端连接
    if err != nil{
        fmt.Println(err)
        return
    }
    defer tcpCoon.Close()  //记得关闭连接对象
    data := make([]byte, 2048)
    n, err := tcpCoon.Read(data)  //客户端连接后,开始读取数据
    if err != nil{
        fmt.Println(err)
        return
    }
    recvStr := string(data[:n])
    fmt.Println("Recv:", recvStr)
    tcpCoon.Write([]byte(strings.ToUpper(recvStr)))  //转换成大写后返回客户端
}

开启服务端,进入监听状态等待客户端连接:

三、客户端实现

package main
import (
    "net"
    "fmt"
)
func main(){
    tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080")  //TCP连接地址
    if err != nil{
        fmt.Println(err)
        return
    }
    tcpCoon, err := net.DialTCP("tcp4", nil, tcpAddr)  //建立连接
    if err != nil{
        fmt.Println(err)
        return
    }
    defer tcpCoon.Close()  //关闭
    sendData := "helloworld"
    n, err := tcpCoon.Write([]byte(sendData))  //发送数据
    if err != nil{
        fmt.Println(err)
        return
    }
    fmt.Printf("Send %d byte data success: %s", n, sendData)
    recvData := make([]byte, 2048)
    n, err = tcpCoon.Read(recvData)  //读取数据
    if err != nil{
        fmt.Println(err)
        return
    }
    recvStr := string(recvData[:n])
    fmt.Printf("Response data: %s", recvStr)

运行客户端,服务端将会响应客户端请求:

服务端状态如下:

至此,一个完成的server和clinet就完成了

最后修改:2024 年 03 月 10 日
如果觉得我的文章对你有用,请随意赞赏