文档章节

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

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

© 著作权归作者所有

共有 人打赏支持
上一篇: 01.C++标识符
下一篇: QThread类
CHONGCHEN
粉丝 0
博文 29
码字总数 13998
作品 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
菜菜从零学习WCF三(配置服务)

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

aehyok
2013/03/27
0
0
初识Exchange2010

Exchange2010系统管理平台分为三种类型: 1、EMC管理平台 2、EMS管理平台 3、ECP管理平台 Exchange2010体系架构: Exchange2010体系架构使用5中角色: 1、邮箱数据库角色(MBX): 装载数据库...

nanhb
2017/04/06
0
0
06. Java NIO Channel to Channel Transfers 通道传输接口

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

逝去的回忆
2016/11/21
12
0

没有更多内容

加载失败,请刷新页面

加载更多

CAS和AQS

CAS(Compare And Swap) 什么是CAS CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制。 CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条...

狼王黄师傅
17分钟前
1
0
Python利用pandas处理Excel数据的应用

Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做自动化...

上官夏洛特
31分钟前
1
0
100:代码管理平台svn

1:代码管理平台:代码版本管理工具,工作中用于代码更新,代码发布统计,代码版本控制;(频繁更新代码的版本记录),方便查阅历史变更,协同开发及合并; 版本管理工具发展: cvs(编码兼容不太好)...

芬野de博客
32分钟前
0
0
Linux学习-1101(rsync下、log、screen)

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 一、 rsync通过服务同步 rsync 通过服务的方式同步,首先需要开启一个服务。它是C/S架构,开启rsync服务,默认端口是8...

wxy丶
38分钟前
1
0
使用jpmml-sparkml-executable生成PMML模型文件

加载依赖的jar包通过./spark-shell --jars ./jpmml-sparkml-executable-1.2.13.jar 启动spark import org.apache.spark.ml.classification.LogisticRegressionimport org.apache.spark.m......

KYO4321
42分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部