Go实现文件传输(基本传输可用)

发送端

package main

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

func SendFile(path string, connect net.Conn){

	file, oerr :=os.Open(path)
	if oerr !=nil{
		fmt.Println("Open", oerr)
		return
	}
	defer file.Close()
	buff := make([]byte,1024*4)
	for{
		size, rerr := file.Read(buff)
		if rerr != nil{
			if rerr == io.EOF{
				fmt.Println("EOF",rerr)

			}else{
				fmt.Println("Read:", rerr)
			}
			return
		}
		connect.Write(buff[:size])
	}
}

func main(){

	fmt.Print("请输入需要传输的文件路径:")
	var path string
	fmt.Scan(&path)

	info, serr :=os.Stat(path)
	if serr !=nil{
		fmt.Println("Stat", serr)
		return
	}

	connect, derr :=net.Dial("tcp","127.0.0.1:10240")
	if derr !=nil{
		fmt.Println("Dial", derr)
		return
	}

	_,werr:= connect.Write([]byte(info.Name()))
	if werr!=nil{
		fmt.Println("Write",werr)
		return
	}

	buff := make([]byte,4096)
	size,rerr := connect.Read(buff)
	if rerr!=nil{
		fmt.Println("Read",rerr)
		return
	}

	if "ok" == string(buff[:size]){
		SendFile(path, connect)
	}

	defer connect.Close()
}

接收端

package main

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

func ReadFile(fileName string, connect net.Conn) {
	file, ferr := os.Create(fileName)
	if ferr != nil {
		fmt.Println("Create", ferr);
		return
	}
	buff := make([]byte, 1024*4)
	for {
		size, rerr := connect.Read(buff)
		if rerr != nil {
			if rerr == io.EOF {
				fmt.Println("EOF",rerr)
			} else {
				fmt.Println("Read", rerr)
			}
			return
		}
		file.Write(buff[:size])
	}
}

func Response(connect net.Conn) {
	defer connect.Close()
	buff := make([]byte, 1024*4)
	size, rerr := connect.Read(buff)
	if rerr != nil {
		fmt.Println("Read", rerr)
		return
	}
	fileName := string(buff[:size])
	connect.Write([]byte("ok"))
	ReadFile(fileName, connect)
}

func main() {
	//监听
	listen, lerr := net.Listen("tcp", "127.0.0.1:10240")
	if lerr != nil {
		fmt.Println("Listen", lerr)
		return
	}

	fmt.Println("等待客户端发送文件")
	for {
		connect, cerr := listen.Accept()
		if cerr != nil {
			fmt.Println("Accept", cerr)
			return
		}
		go Response(connect);
	}
	defer listen.Close()
}

转载于:https://my.oschina.net/mistylinux/blog/1929975

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值