码迷,mamicode.com
首页 > 编程语言 > 详细

go语言实现文件传输

时间:2020-09-17 17:56:14      阅读:31      评论:0      收藏:0      [点我收藏+]

标签:tcp   端口   string   写入   打开文件   cep   close   mon   space   

发送端

ackage main

import (
"fmt"
"io"
"net"
"os"
)

func main() {
//获取文件属性
fmt.Println("请输入文件:")
var path string
fmt.Scan(&path)
file, err := os.Open(path)
if err != nil {
fmt.Println("os.Open err = ", err)
return
}
//获取文件属性
f, err := file.Stat()

fmt.Println(f.Name(), f.Size())

//主动连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Dial err=", err)
return
}
//文件接收完毕关闭连接
defer conn.Close()
//给接收方发送文件名
_, err = conn.Write([]byte(f.Name()))
if err != nil {
fmt.Println("conn.Write err ", err)
return
}

//接受对方回复, 如果回复“ok” 说明对方准备好了, 可以发送文件了
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err=", err)
return
}
//接收到ok发送文件内容
if "ok" == string(buf[:n]) {
//发送文件内容
SendFile(path, conn)
}
//

}
func SendFile(path string, conn net.Conn) {
//以只读方式打开文件
f, err := os.Open(path)
if err != nil {
fmt.Println("os.Open err:", err)
return
}
//延迟关闭
defer f.Close()
//定义缓存字节切片
buf := make([]byte, 1024*4)
for {
//从文件读取数据写入到buf缓存
n, err := f.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("文件发送完毕")
} else {
fmt.Println("f.Read err:", err)
}
return
}
//发送内容
conn.Write(buf[:n])
}

}

发送端
package main

import (
"fmt"
"io"
"net"
"os"
)

func main() {
//创建一个tcp连接 , 端口为80
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Listen err ", err)
return
}
//延迟关闭监听
defer listener.Close()

//堵塞等待用户连接, 这里只让用户连接一次 , 可以用for 一直监听
conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.Accept err :", err)
return
}
//延迟关闭
defer conn.Close()

buf := make([]byte, 1024)

//将文件内容缓存进入buf
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err ", err)
return
}
//将缓存区里面的文件名称赋值给fileName
fileName := string(buf[:n])
//回复“ok”
conn.Write([]byte("ok"))

//接收文件内容
RecvFile(fileName, conn)

}
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, 1024*4)
//接收多少 , 写多少
for {
n, err := conn.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("文件接收完毕")
} else {
fmt.Println("conn.Read err:", err)

}
return
}
if n == 0 {
fmt.Println("n==0, 文件接收完毕")
return
}
f.Write(buf[:n])
}
}


go语言实现文件传输

标签:tcp   端口   string   写入   打开文件   cep   close   mon   space   

原文地址:https://www.cnblogs.com/syuee/p/13629752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!