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

文章目录

1、通信

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

通信两个重要的要素:IP+PORT ,IP找到计算机,端口找到对应的应用:

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

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

2、建立连接与释放连接

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

四次挥手,释放TCP连接

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

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

3、创建客户端连接

调用Dial函数:(net包下)

示例:

go 复制代码
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)
}

4、创建服务端连接

Listen方法进行监听:

示例:

go 复制代码
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())
                }
        }
}

先启动服务端程序:

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

再看服务端:

5、发送终端数据

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

go 复制代码
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)
        
}

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

go 复制代码
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不一样的
        }
}

运行:

相关推荐
白帽黑客沐瑶2 天前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
树码小子2 天前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题2 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说2 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
绿箭柠檬茶2 天前
Ubuntu 服务器配置转发网络访问
服务器·网络·ubuntu
我是菜鸟0713号2 天前
Qt 中 OPC UA 通讯实战
开发语言·qt