Go:网络

TCP/IP协议介绍

1. 互联网起源

              1. 起源于美国五角大楼,它的前身是美国国防部高级研究计划局 主持研制的ARPAnet。

              2. 互联网的基础是TCP/IP协议

              3. TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

2. TCP/IP协议 

              1. TCP (传输控制协议) - 应用程序之间通信。

              2. UDP (用户数据包协议) - 应用程序之间的简单通信

              3. IP (网际协议) - 计算机之间的通信。

              4. DHCP (动态主机配置协议) - 针对动态寻址。

3. TCP协议

              1. 面向连接的协议

              2. 可靠传输,发送的数据保证对方能够收到。

              3. 保证时序,发送的数据按发送的顺序到达。

              4. 全双工的。

4. IP协议

              1. 用于计算机之间进行通信,是TCP/UDP协议的底层

              2. IP是无连接的,负责把数据包路由到目的地。

5. TCP/IP协议图解

6. TCP协议基础

              1. 通过IP和端口进行计算机之间进行访问

              2. 域名和知名端口,http:80,https:443,ssl:22端口等

7. Tcp服务端编程模型

8. 服务端处理流程

              1.监听端口

              2.接收客户端链接

              3.创建goroutine处理该链接

TCP服务端

package main
//服务端
import(
    "fmt"
    "net"
)
func main(){
    fmt.Println("start server...")
    listen,err := net.Listen("tcp","0.0.0.0:50000")
    if err! = nil {
        fmt.Println("listen failed,err:",err)
        return
    }
    for{
        conn,err := listen.Accept()
        if err != nil {
            fmt.Println("accept failed,err:",err)
            continue
        }
        go process(conn)
    }
}
func process(conn net.Conn){
    defer conn.Close()
    for{
        buf := make ([]byte,512)
        _ , err := conn.Read(buf)
        if err != nil {
            fmt.Println("read err:",err)
            return
        }
        fmt.Println("read:",string(buf))
      }
}

10. 客户端编程模式

              1.建立与服务端的链接

              2.进行数据收发

              3.关闭链接

TCP客户端

package main
import(
    "bufio"
    "fmt"
    "net"
    "os"
    "string"
)
func main(){
    conn,err := net.Dial("tcp","localhost:50000")
    if err != nil {
        fmt.Println("Error dialing",err.Error())
        return
    }
    defer conn.Close()
    inputReader := bufio.NewReader(os.Stdin)
    for{
        input,_ := inputReader.ReadString('\n')
        trimmedInput := strings.Trim(input,"\r\n")
        if trimmedInput == "Q" {
            return
        }
        _,err = conn.Write([]byte(trimmedInput))
        if err != nil {
            return
        }
    }
}

12.发送HTTP请求

              1. HTTP协议是基于TCP协议之上的文本协议。

              2. 每行文本使用\r\n结尾,当连续两个\r\n时,表示整个数据包结束。

package main
import(
    "fmt"
    "io"
    "net"
)
func main(){
    conn,err := net.Dial("tcp","wwww.baidu.com:80")
    if err != nil {
        rmt.Println("Error dialing",err.Error())
        return
    }
    defer conn.Close()
    msg := "GET/HTTP1.1\r\n"
    msg += "Host:www.baidu.com\r\n"
    msg += "Connection:close\r\n"
    msg += "\r\n\r\n"
    _,err = io.WriteString(conn,msg)
    if err != nil{
        fmt.Println("write string failed",err)
        return
    }
    buf := make([]byte,4096)
    for{
        count,err := conn.Read(buf)
        if err != nil {
            break
        }
        fmt.Println(String(buf[0:count]))
    }

13. UDP协议

              1. 用户数据库报协议

              2. 无连接,直接进行数据发送

              3. 不可靠、没有时序

              4. 实时性比较好,通常用于视频直播相关领域。

UDP服务端代码

package main
import (
    "fmt"
    "net"
)
func main() {
    // 创建监听
    socket, err := net.ListenUDP("udp4", &net.UDPAddr{
    IP: net.IPv4(0, 0, 0, 0),
    Port: 8080,
    })
    if err != nil {
        fmt.Println("监听失败!", err)
        return
    }
    defer socket.Close()
    for {
        // 读取数据
        data := make([]byte, 4096)
        read, remoteAddr, err := socket.ReadFromUDP(data)
        if err != nil {
            fmt.Println("读取数据失败!", err)
            continue
        }
        fmt.Println(read, remoteAddr)
        fmt.Printf("%s\n\n", data)
        // 发送数据
        senddata := []byte("hello client!")
        _, err = socket.WriteToUDP(senddata, remoteAddr)
        if err != nil {
            return
            fmt.Println("发送数据失败!", err)
        }
    }
}

UDP客户端代码

package main
import (
    "fmt"
    "net"
)
func main() {
    // 创建连接
    socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
    IP: net.IPv4(192, 168, 1, 103),
    Port: 8080,
    })
    if err != nil {
        fmt.Println("连接失败!", err)
        return
    }
    defer socket.Close()
    // 发送数据
    senddata := []byte("hello server!")
    _, err = socket.Write(senddata)
    if err != nil {
        fmt.Println("发送数据失败!", err)
        return
    }
    // 接收数据
    data := make([]byte, 4096)
    read, remoteAddr, err := socket.ReadFromUDP(data)
    if err != nil {
        fmt.Println("读取数据失败!", err)
        return
    }
    fmt.Println(read, remoteAddr)
    fmt.Printf("%s\n", data)
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值