先写客户端代码
func main() {
fmt.Println("请输入需要传输的文件路径")
var path string
fmt.Scan(&path)
//获取文件名
info, err := os.Stat(path)
if err != nil {
fmt.Println("err = ", err)
return
}
//连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("err = ", err)
return
}
defer conn.Close()
//给服务器发送文件名
_, err = conn.Write([]byte(info.Name()))
if err != nil {
fmt.Println("err = ", err)
return
}
//接收服务器回复
bytes := make([]byte, 1024)
num, err := conn.Read(bytes)
if err != nil {
fmt.Println("err = ", err)
return
}
if string(bytes[:num]) == "ok" {
//发送文件内容
sendFile(path, conn)
}
}
func sendFile(path string, conn net.Conn) {
file, err := os.Open(path)
if err != nil {
fmt.Println("err = ", err)
return
}
defer file.Close()
//读取文件内容
arr := make([]byte, 1024)
for {
num, err := file.Read(arr)
conn.Write(arr[:num])
if err == io.EOF {
break
}
if err != nil {
fmt.Println("err = ", err)
return
}
}
}
然后是服务器代码
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("err = ", err)
return
}
defer listener.Close()
//阻塞等待用户连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("err = ", err)
return
}
defer conn.Close()
//读取文件名
bytes := make([]byte, 1024)
num, err := conn.Read(bytes)
if err != nil {
fmt.Println("err = ", err)
return
}
fileName := string(bytes[:num])
//回复"ok"
conn.Write([]byte("ok"))
//接收文件内容
receiveFile(fileName, conn)
}
func receiveFile(path string, conn net.Conn) {
file, err := os.Create(path)
if err != nil {
fmt.Println("err = ", err)
return
}
bytes := make([]byte, 1024)
for {
num, err := conn.Read(bytes)
file.Write(bytes[:num])
if err == io.EOF {
break
}
if err != nil {
fmt.Println("err = ", err)
return
}
}
}