server:
package main import ( "fmt" "net" "os" ) func SHandleError(err error, when string) { if err != nil{ fmt.Println("服务端异常退出,err=", err, when) os.Exit(1) } } 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的链接 ", conn.RemoteAddr()) }() dstFile, e := os.OpenFile(`meinv1.mp4`, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) for { //接受客户端上传的文件 buffer := make([]byte, 100) n, e := conn.Read(buffer) SHandleError(e, "conn.Read") //写入服务端本地文件 dstFile.Write(buffer[:n]) fmt.Printf("成功写入%d个字节 ", n) //如果本次接受的数据没有填满一个缓冲区,说明数据已经接受完毕 if n < 100{ fmt.Println("文件接受成功") dstFile.Close() //回复客户端已收到文件 conn.Write([]byte("文件接受成功")) break } } }
client:
package main import ( "fmt" "io/ioutil" "net" "os" ) /* ·实现tcp文件上传功能 */ func CHandleError(err error,when string) { if err != nil{ fmt.Println("客户端异常退出:err=", err, when) os.Exit(1) } } func main() { conn, e := net.Dial("tcp", "127.0.0.1:8080") CHandleError(e, "net.Dial") defer func() { conn.Close() fmt.Println("客户端正常退出") }() bytes, e := ioutil.ReadFile(`preview.jpg`) CHandleError(e, "ioutil.ReadFile") _, e = conn.Write(bytes) CHandleError(e, "conn.Write") buffer := make([]byte, 1024) n, e := conn.Read(buffer) CHandleError(e, "conn.Read") replyMsg := buffer[:n] fmt.Println("服务端:", string(replyMsg)) }