• 【Go】十九、网络连接与请求发送


    1、通信

    把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。设备之间在网络中进行数据的传输,发送/接收数据。

    在这里插入图片描述
    通信两个重要的要素:IP+PORT ,IP找到计算机,端口找到对应的应用:

    在这里插入图片描述

    设备之间进行数据传输,遵循一定的规则 => 通信协议 + 七层模型

    在这里插入图片描述

    两个设备之间传输数据,每过一层,就做一层封装(如经过应用层,添加一个APP的头),传输到设备2上以后,再逐层拆封。有点像快递发货和收货了。

    在这里插入图片描述

    2、建立连接与释放连接

    三次握手,确定双方的收发能力都正常,然后成功建立TCP连接

    在这里插入图片描述
    四次挥手,释放TCP连接

    在这里插入图片描述

    TCP协议是可靠的,相反,UDP协议是不可靠的,UDP在发送数据之前不需要建立连接,也不需要维护连接状态。

    在这里插入图片描述

    UDP的以上几点,形象说:一个班级计划从学校出发,去地点A春游,十点在地点A集合(地点A类比目标机器,学校就是另一台客户端机器)。但去地点A不是统一过去,大家去地点A的方式不同,有的骑车,有的步行。十点以后,到地点A的学生玩去了,其他半路上迟到的或者迷路的不再管了。

    3、创建客户端连接

    调用Dial函数:(net包下)

    在这里插入图片描述

    示例:

    package main
    import(
            "fmt"
            "net" //所需的网络编程全部都在net包下
    )
    func main(){
            //打印:
            fmt.Println("客服端启动。。")
            //调用Dial函数:参数需要指定tcp协议,需要指定服务器端的IP+PORT
            conn,err := net.Dial("tcp","127.0.0.1:8888")
            if err != nil {//连接失败
                    fmt.Println("客户端连接失败:err:",err)
                    return
            }
            fmt.Println("连接成功,conn:",conn)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4、创建服务端连接

    Listen方法进行监听:

    在这里插入图片描述
    示例:

    package main
    import(
            "fmt"
            "net" //所需的网络编程全部都在net包下
    )
    func main(){
            //打印:
            fmt.Println("服务器端启动了。。")
            //进行监听:需要指定服务器端TCP协议,服务器端的IP+PORT
            listen,err := net.Listen("tcp","127.0.0.1:8888")
            if err != nil{//监听失败
                    fmt.Println("监听失败,err:",err)
                    return
            }
            //监听成功以后:
            //循环等待客户端的链接:
            for{
                    conn,err2 := listen.Accept()
                    if err2 != nil {//客户端的等待失败
                            fmt.Println("客户端的等待失败,err2:",err2)
                    }else{
                            //连接成功:
                            fmt.Printf("等待链接成功,con=%v ,接收到的客户端信息:%v \n",conn,conn.RemoteAddr().String())
                    }
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    先启动服务端程序:

    在这里插入图片描述

    启动客户端去连接服务端:

    在这里插入图片描述

    再看服务端:

    在这里插入图片描述

    5、发送终端数据

    客户端发送收据:在成功建立连接的基础上,用connect对象的Write方法,向服务端发送数据

    package main
    import(
            "fmt"
            "net" //所需的网络编程全部都在net包下
            "bufio"
            "os"
    )
    func main(){
            //打印:
            fmt.Println("客服端启动。。")
            //调用Dial函数:参数需要指定tcp协议,需要指定服务器端的IP+PORT
            conn,err := net.Dial("tcp","127.0.0.1:8888")
            if err != nil {	//连接失败
                    fmt.Println("客户端连接失败:err:",err)
                    return
            }
            fmt.Println("连接成功,conn:",conn)
            //通过客户端发送单行数据,然后退出:
            reader := bufio.NewReader(os.Stdin)//os.Stdin代表终端标准输入
            //从终端读取一行用户输入的信息:
            str,err := reader.ReadString('\n')
            if err != nil {
                    fmt.Println("终端输入失败,err:",err)
            }
            //将str数据发送给服务器:
            n,err := conn.Write([]byte(str))
            if err != nil{
                    fmt.Println("连接失败,err:",err)
            }
            fmt.Printf("终端数据通过客户端发送成功,一共发送了%d字节的数据,并退出",n)
            
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    服务端,创建一个协程去处理客户端的请求:

    package main
    import(
            "fmt"
            "net" //所需的网络编程全部都在net包下
    )
    func process(conn net.Conn){
            //连接用完一定要关闭:
            defer conn.Close()
            for{
                    //创建一个切片,准备:将读取的数据放入切片:
                    buf := make([]byte,1024)
                    //从conn连接中读取数据:
                    n,err := conn.Read(buf)
                    if err != nil{
                            return
                    }
                    //将读取内容在服务器端输出:
                    fmt.Println(string(buf[0:n]))
            }
    }
    func main(){
            //打印:
            fmt.Println("服务器端启动了。。")
            //进行监听:需要指定服务器端TCP协议,服务器端的IP+PORT
            listen,err := net.Listen("tcp","127.0.0.1:8888")
            if err != nil{//监听失败
                    fmt.Println("监听失败,err:",err)
                    return
            }
            //监听成功以后:
            //循环等待客户端的链接:
            for{
                    conn,err2 := listen.Accept()
                    if err2 != nil {//客户端的等待失败
                            fmt.Println("客户端的等待失败,err2:",err2)
                    }else{
                            //连接成功:
                            fmt.Printf("等待链接成功,con=%v ,接收到的客户端信息:%v \n",conn,conn.RemoteAddr().String())
                    }
                    //准备一个协程,协程处理客户端服务请求:
                    go process(conn)//不同的客户端的请求,连接conn不一样的
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    运行:

    在这里插入图片描述

  • 相关阅读:
    【快应用】webview接口打开网页,网页会被自动放大,如何适配手机大小
    Unity可视化Shader工具ASE介绍——8、UI类型的特效Shader编写
    计算机毕设(附源码)JAVA-SSM楼盘销售管理系统
    ElasticSearch-Mapping详解
    win11怎么更新22H2?不要错过这两个Win11升级22H2的好方法!
    漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议
    用python画折线图
    java-php-python-springboot网上教学系统计算机毕业设计
    白盒测试之语句覆盖、判定覆盖、条件覆盖等
    【vue实战项目】通用管理系统:首页
  • 原文地址:https://blog.csdn.net/llg___/article/details/137275374