发送方

package main

import (
"fmt"
"os"
"net"
"io"
)
//发送文件内容
func SendFile(path string, conn net.Conn) {
//以只读方式打开文件
f, err := os.Open(path)
if err != nil {
fmt.Println("open file err = ", err)
return
}
defer f.Close()
//核心功能,读多少就发送多少
buf := make([]byte, )
for true {
n , err := f.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("文件发送完毕")
return
}else {
fmt.Println("f.read err = ", err)
return
}
}
//给服务器发送内容
conn.Write(buf[:n])
}
} func main() {
//提示输入文件
fmt.Println("请输入需要传输的文件:")
var path string
fmt.Scan(&path) //获取文件名
info, err := os.Stat(path)
if err != nil {
fmt.Print("获取文件名err = ", err)
return
}
//文件连接服务器
conn, err1 := net.Dial("tcp", ":8000")
if err1 != nil {
fmt.Println("net.Dial err = ", err1)
return
} defer conn.Close() //给接收方发送文件名
_, err = conn.Write([]byte(info.Name()))
if err != nil {
fmt.Println("conn.Write err = ", err)
return
}
buf := make([]byte, )
n, err := conn.Read([]byte(buf))
if err != nil {
fmt.Println("conn.Read err = ", err)
}
if "ok" == string(buf[:n]) {
fmt.Println("开始发送文件了")
//发送文件
SendFile(path, conn)
}
}

接收方

package main

import (
"net"
"fmt"
"os"
"io"
) //接收文件内容
func RecvFile(fileName string, conn net.Conn) {
//新建一个文件
f, err := os.Create(fileName)
if err != nil {
fmt.Println("os.Create err = ", err)
return
}
buf := make([]byte, *)
for true {
n, err := conn.Read(buf) //接收对方发过来的文件内容
if err != nil {
if err == io.EOF {
fmt.Println("文件接收完毕")
}else {
fmt.Println("f.read err = ", err)
return
}
}
f.Write(buf[:n])
}
} func main() {
//监听
listener, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println("net.Listen err = ", err)
return
} defer listener.Close() conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.Accept err = ", err)
return
}
//读取文件名
buf := make([]byte, )
var n int
n, err = conn.Read(buf)
if err != nil {
fmt.Println("conn read err = " ,err)
return
}
fileName :=string(buf[:n])
//回复OK
conn.Write([]byte("ok")) //接收文件内容
RecvFile(fileName, conn)
}

先开始发送方的服务后再开始接收方,在发送方输入发送的文件名

[GO]文件的收发服务器-LMLPHP

05-07 15:16
查看更多