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
}
}
}

浙公网安备 33010602011771号