先寫用戶端代碼
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
}
}
}