简单的文件传输

package main
import (
	"net"
	"fmt"
	"log"
	"time"
	"os"
	"bufio"
	"flag"
	"strconv"
)
func writeFile(path string,write* bufio.Writer )  {
	pFile,error:=os.OpenFile(path, os.O_RDONLY, 0666)
	defer pFile.Close()
	if error!=nil {
		fmt.Println(error)
		return
	}
	read:=bufio.NewReader(pFile)
	bytes:= make([]byte,1000)
	for  {
		n,error:=read.Read(bytes)
		if error!=nil {
			break
		}
		bytes = bytes[:n]
		write.Write(bytes)
	}
	write.Flush()
}
//启动服务端
func startServer()  {
	addr:="0.0.0.0:8888"
	listener,error:=net.Listen("tcp",addr)
	if error!=nil {
		fmt.Println(error)
		return
	}
	defer listener.Close()
	for  {
		fmt.Println("服务端等待接收文件。。。")
		conn,err:=listener.Accept()
		if err !=nil{
			log.Fatal(err)
		}
		go func() {
			t:=time.Now()
			pathWrite:="./"+ strconv.FormatInt(t.Unix(),10) +".new"   //time.Now().Format("2006-01-02-15-04-05")
			wPFile,error2:= os.OpenFile(pathWrite,os.O_CREATE|os.O_WRONLY,0666)
			defer wPFile.Close()
			if error2 !=nil{
				fmt.Println(error)
				return
			}
			write:=bufio.NewWriter(wPFile)
			//接收客户端发来的数据
			for{
				bytes:=make([]byte,1024)
				n,err2:=conn.Read(bytes)
				if err2 != nil {
					fmt.Println(err2)
					fmt.Println("接收文件地址为 : ",pathWrite)
					break
				}
				write.Write(bytes[:n])
				write.Flush()
			}
		}()
	}
}
//启动客户端
func startClient(path,addr string)  {
	conn,err:=net.Dial("tcp",addr)
	if err!=nil{
		log.Fatal(err)
	}
	defer conn.Close()
	fmt.Println(conn.RemoteAddr().String())
	write:= bufio.NewWriter(conn)
	//向服务端写入数据
	writeFile(path,write)
	time.Sleep(time.Second)
}
func main() {
	f := flag.String("f", "nil", "文件路径")
	h :=flag.String("h", "nil", "对方主机")
	s :=flag.String("s", "nil", "服务器启动")
	flag.Parse()
	path:=*f
	addr:=*h
	index:=0
	if "nil" != path {
		index++
	}
	if "nil" != addr {
		index++
	}
	if  index == 2{
		startClient(path,addr)
	}else {
		if "start" == *s {
			startServer()
		}else {
			fmt.Println("启动客户端 eg: ./main -h ip:8888 -f 文件\n"+
                            "启动服务端 eg: ./main -s start")
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值