文档章节

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

CHONGCHEN
 CHONGCHEN
发布于 08/18 13:04
字数 306
阅读 42
收藏 0
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()
}

© 著作权归作者所有

共有 人打赏支持
CHONGCHEN
粉丝 0
博文 21
码字总数 12771
作品 0
武汉
后端工程师
想做一个不用FTP协议的文件传输软件,如何?

FTP协议要开多个端口,对防火墙等不太友好。 目前只想实现简单的功能,socket传输文件,简单的用户认证,目录列表,上传下载等等 分为server和client,基本考虑用C实现。 市面上都是ftp的,s...

难易
2012/04/27
507
8
SocketIo+SpringMvc实现文件的上传下载

SocketIo+SpringMvc实现文件的上传下载 socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: GIT地址: https://git...

charlyFeng
08/07
0
0
06. Java NIO Channel to Channel Transfers 通道传输接口

在Java NIO中如果一个channel是FileChannel类型的,那么他可以直接把数据传输到另一个channel。逐个特性得益于FileChannel包含的transferTo和transferFrom两个方法。 transferFrom() FileCha...

逝去的回忆
2016/11/21
12
0
菜菜从零学习WCF三(配置服务)

配置服务概述   在设计和实现服务协定后,即可配置服务。在其中可以定义和自定义如何向客户端公开服务,包括指定可以找到服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需...

aehyok
2013/03/27
0
0
利用ssh+rsync+inotify实现数据的异地实时同步

在服务器中,通常结合计划任务、shell脚本来执行本地备份。为了进一步提高备份的可靠性,使用异地备份也是非常重要的,利用rsync工具,可以实现快速、高效的异地备份。本篇博客将配置rsync+c...

杨书凡
01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中秋快乐!!!

HiBlock
22分钟前
0
0
Node安装教程

1、安装最新版的node 2、设置相关目录(以D盘为例) 分别建立目录:D:\node,D:\node\node-globa,D:\node\node-cache 命令行输入: // 设置npm国内镜像 npm config set registry https://re...

Mohan710
50分钟前
1
0
中国发布域名系统基础软件 “红枫”

9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软件 “红枫(Maple DNS)”。 9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软...

问题终结者
今天
3
0
Shell编程(分发系统介绍、expect远程登录、expect远程执行命令、expect传递参数)

分发系统介绍expect 分发系统expect即分发脚本,是一种脚本语言;通过他可以实现传输,输入命令(上线代码) 应用场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者...

蛋黄_Yolks
今天
2
0
Java Http请求工具类

public static String httpPost(String source, String params) {URL url = null;HttpURLConnection conn = null;OutputStream os = null;String ret = null;try {......

yuewawa
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部