第七天

1、协议

1.1、链路层

  • 网卡---> mac地址处理
  • 广播风暴

1.2 网络层

  • 广播只在当前局域网有效 IP---->MAC

1.3 传输层(端口号)

  • 指定端口交换数据

1.4 应用层

  • 按格式进行数据解析

2、组包与拆包

2.1 组包

  • "hello"
  • 源端口+目的端口->"hello"
  • 源IP+目的IP->源端口+目的端口->"hello"
  • 源Mac+目的Mac->源IP+目的IP->源端口+目的端口->"hello"

2.2 拆包

  • 源Mac+目的Mac->源IP+目的IP->源端口+目的端口->"hello"
  • 源IP+目的IP->源端口+目的端口->"hello"
  • 源端口+目的端口->"hello"
  • "hello"

3、Socket介绍

4、CS模型介绍

5、TCP通讯过程

  • 服务器代码
//导入net包

//1.监听
listener, err := net.Listen("tcp","127.0.0.1:8000")

if err != nil{
    fmt.Println(err)
    return
}

defer listener.Close()

//2.阻塞等待用户链接
for {
    conn, err := net.Accept()
    
    if err != nil{
        fmt.Println(err)
        continue
    }
    
    //3.接收用户的请求
    buf := make([]byte,1024)
    n, err1 := conn.Read(buf)
        if err1 != nil{
        fmt.Println(err1)
        continue
    }
    
    println(string(buf[:n]))
    
    defer conn.Close()
}
  • 客户端代码
//导入net包

//1.主动连接服务器
conn, err := net.Dail("tcp","127.0.0.1:8000")

if err != nil{
    fmt.Println(err)
    return
}

defer conn.Close()

//2.发送数据
conn.Write([]byte("are u ok"))

6、简单并发服务器

//导入net包

//1.监听
listener, err := net.Listen("tcp","127.0.0.1:8000")

if err != nil{
    fmt.Println(err)
    return
}

defer listener.Close()

//2.接收多个用户
for {
    conn, err := net.Accept()
    
    if err != nil{
        fmt.Println(err)
        continue
    }
    
    //3.处理用户的请求
    go HandleConn(conn)
}


func HandleConn(conn net.Conn){
    defer Conn.Close()

    //获取客户端网络信息
    addr := Conn.RemoteAddr().String()
    
    for {
            //读取用户数据
        n, err1 := conn.Read(buf)
        if err1 != nil{
            fmt.Println(err1)
            continue
        }
        
        println(string(buf[:n]))
        
        if "exit" == string(buf[:n]){
            return
        }
    
        //把数据转化为大写再返回给客户端
        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}
//导入net包

//1.主动连接服务器
conn, err := net.Dail("tcp","127.0.0.1:8000")

if err != nil{
    fmt.Println(err)
    return
}

defer conn.Close()

go func(){
    buf := make([]byte,1024)
    for {
        n, err := conn.Read(buf)
        if err != nil{
            continue
        }
        fmt.Println(string(buf[:n]))
    }
}()

//2.发送数据   主子协程程序交换位置,会中断操作(主协程中断)
for {
    n,err := os.Stdin.Read(str)
      if err != nil{
            continue
        }
        conn.Write(str[:n])
}

7、文件传输

7.1 os.stat

func main(){
    list := os.Args
    if len(list) == 2 {
        fmt.Println("err")
    }
    
    fileName = list[1]
    info, err := os.Stat(fileName)
    if err != nil{
        return
    }
    fmt.Println(info.Name())
}

7.2 文件发送方

//发送文件

func SendFile(path string,conn net.Conn){
    //以自读方式打开文件
    f,err := os.Open(path)
    if err != nil{
        return
    }
    
    defer f.Close()
    
    //读文件内容,读多少就发多少
    buf := make([]byte,4*1024)
    for{
        n,err = f.Read(buf)
        if err!= nil{
            if err == io.EOF{
                fmt.Println("文件结束")
            }
            else{
                fmt.Println("err = ",err)
            }
        }
        
        //发送内容,发送给服务器
        conn.Write(buf[:n])
    }
    
}


func main(){
    var path string
    fmt.Scan(&path)
    
    info, err := os.Stat(path)
    if err != nil{
        return
    }
    fmt.Println(info.Name())
    
    //1.主动连接服务器
    conn, err1 := net.Dail("tcp","127.0.0.1:8000")
     if err1 != nil{
        return
    }
    
    defer conn.Close()
    —,err2 := conn.Write([]byte(info.Name))
    if err2 != nil{
        return
    }
    
    var n int
    buf := make([]byte,1024)
    //如果收到ok则成功
    n, err3 := conn.Read(buf)
    if string(buf[:n]) == "ok"{
    
        //发送文件内容
        SendFile(path,conn)
    }
}

7.2 文件接收方


func ReciveFile(fileName string, conn net.Conn){
    //新建文件
    f,err := os.Create(fileName)
    if err != nil{
        return
    }
    
    buf := make([]byte,1024*4)
    
    //接收多少写多少
    for{
        n, err := conn.Read(buf)
        if err != nil{
            if err == io.EOF {
                
            } 
            else
            {
                return
            }
        }
         f.Wirte(buf)//往文件写内容
        
    }
}




func main(){
    //1.监听
    listener, err := net.Listen("tcp","127.0.0.1:8000")

    if err != nil{
        fmt.Println(err)
        return
    }

    defer listener.Close()
    
    //等待用户连接
    conn, err1 := net.Accept()
    if err1 != nil{
        fmt.Println("xxxx")
        return
    }
    
    //读取对方发送的文件名
    buf := make([]byte,1024)
    n, err2 := conn.Read(buf)
    if err2 != nil{
        return
    }

    fileName := string(buf[:n])
    
    //回复OK
    conn.Write([]byte("ok"))
    
    //接收文件内容
    ReciveFile(fileName,conn)
    
}

8、聊天室

8.1

你可能感兴趣的:(第七天)