send
package main
import (
"fmt"
"io"
"net"
"os"
)
func sendfile(conn net.Conn,path string) {
f,err:=os.Open(path)//读打开的文件
if err!=nil{
fmt.Println("os open err",err)
}
defer f.Close()
buf := make([]byte,4096)//从本地读取数据传给接收端
for{
n,err3 := f.Read(buf)
if err3!=nil{
if err3==io.EOF{
fmt.Println("发送数据完成")
}else {
fmt.Println("io read err",err3)
}
return
}
_,err:=conn.Write(buf[:n])
if err!=nil{
fmt.Println("conn write err",err)
return
}
}
}
func main() {
list := os.Args
if len(list)!=2{
fmt.Println("输入的格式为:文件路径 文件名")
return
}
path:= list[1]
fileinfo,err:=os.Stat(path)
if err!=nil{
fmt.Println("os stat err",err)
return
}
filename:= fileinfo.Name()
fmt.Println(filename)
conn,err1 :=net.Dial("tcp","127.0.0.1:8004")
if err1!=nil{
fmt.Println("链接服务器失败")
return
}
defer conn.Close()
conn.Write([]byte(filename))
buff := make([]byte,4096)
n,err2:=conn.Read(buff)
if err2 !=nil{
fmt.Println("conn read err",err2)
}
if "ok"== string(buff[:n]){
//写文件内容给服务器
sendfile(conn,path)
}
}
receive
package main
import (
"fmt"
"net"
"os"
)
//写入数据到文件
func receivefile(conn net.Conn,filename string) {
//现在有文件名直接创建文件
f,err:=os.Create(filename)
if err!=nil{
fmt.Println("os create file err",err)
return
}
defer f.Close()
buff:= make([]byte,4096)
//从网络中读取数据,循环读
for{
n,_:= conn.Read(buff)
if n == 0{
fmt.Println("接收文件完成")
return
}
//写入到文件
f.Write(buff[:n])
}
}
func main() {
listenserver,err:=net.Listen("tcp","127.0.0.1:8004")
if err!=nil{
fmt.Println("net listen err",err)
}
defer listenserver.Close()
conn,err2:= listenserver.Accept()
if err2!=nil{
fmt.Println("listenserver Accept err",err2)
}
defer conn.Close()
//读取文件名字
buff := make([]byte,4096)
n,err3:=conn.Read(buff)
if err3!=nil{
fmt.Println("conn read err",err3)
}
filename := string(buff[:n])
fmt.Println("接收到文件名",filename)
conn.Write([]byte("ok"))
//接收数据
receivefile(conn,filename)
}