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