flie-server

package main
 
import (
    "bufio"
    "encoding/binary"
    "fmt"
    "net"
    "os"
    "unsafe"
)
 
func SHandleError(err error, when string)  {
    if err != nil{
        fmt.Println("服务端异常退出,err=", err, when)
        os.Exit(1)
    }
}
 
func BytesToInt64(buf []byte) int64 {
    return int64(binary.BigEndian.Uint64(buf))
}
 
func main() {
    //建立tcp监听
    listener, e := net.Listen("tcp", ":8080")
    SHandleError(e, "net.Listen")
    defer func() {
        listener.Close()
        fmt.Println("服务端正常退出")
    }()
 
    //接受客户端请求,建立会话专线Conn
    conn, e := listener.Accept()
    SHandleError(e, "listener.Accept")
    defer func() {
        conn.Close()
        fmt.Printf("已断开与%v的链接\n", conn.RemoteAddr())
    }()
 
    dstFile, e := os.OpenFile(`meinv1.mp4`, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
    writer := bufio.NewWriter(dstFile)
    defer dstFile.Close()
    buffer := make([]byte, 100)
    total := 0
 
    //接受客户端发来的要传文件大小
    buffer2 := make([]byte, 10)
    m, e := conn.Read(buffer2)
    //size := string(buffer2[:m])
    //fmt.Printf("%s\n",size)
    //i, _ := strconv.Atoi(size)
 
    //[]byte转换为int64
    i := BytesToInt64(buffer2[:m])
    fmt.Printf("%d, %T\n",i,i)
    //int64转换为int
    j := *(*int)(unsafe.Pointer(&i))
    fmt.Printf("%d, %T\n",j,j)
 
    for {
        //接受客户端上传的文件
        n, e := conn.Read(buffer)
        SHandleError(e, "conn.Read")
        total += n
 
        //写入服务端本地文件
        writer.Write(buffer[:n])
        writer.Flush()
 
        fmt.Printf("成功写入%d个字节,共%d字节\n", n, total)
 
        //如果实际总接受字节数与客户端给的要传输字节数相等,说明传输完毕
        if total == j{
            fmt.Println("文件接受成功,共",total,"字节")
            //回复客户端已收到文件
            conn.Write([]byte("文件接受成功"))
            break
        }
    }
}

posted @ 2021-12-20 14:43  yangxl-dev  阅读(173)  评论(0)    收藏  举报