转载地址:https://www.cnblogs.com/qq702368956/p/10195497.html

获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者。

发送者

package main

import (
"fmt"
"io"
"net"
"os"
) func main() {
var addr string = "127.0.0.1:1234"
fmt.Println("请输入需要传输的文件:")
var path string = "./test.txt"
info, errf := os.Stat(path)
if errf != nil{
fmt.Println("os.Stat errf =", errf)
return
} conn, err := net.Dial("tcp", addr)
if err != nil{
fmt.Println("net.Dial err =",err)
return
}
defer conn.Close() _, err = conn.Write([]byte(info.Name()))
if err != nil{
fmt.Println("conn.Write info.Name err =",err)
return
}
var n int
buf := make([]byte, 1024)
n, err = conn.Read(buf)
if err != nil{
fmt.Println("conn.Read ok err =", err)
return
}
if "ok" == string(buf[:n]){
fmt.Println("ok")
SendFile(path, conn)
}
} func SendFile(path string, conn net.Conn){
file , err := os.Open(path) if err != nil{
fmt.Println("os.Open err =", err)
return
}
defer file.Close()
buf := make([]byte, 1024 * 4) for {
n, err := file.Read(buf)
if err != nil{
if err == io.EOF{
fmt.Println("文件发送完毕")
} else{
fmt.Println("file.Read err =",err)
} return
}
if n == 0{
fmt.Println("文件发送完毕")
break
}
conn.Write(buf[:n])
}
}

接收者

package main

import (
"fmt"
"io"
"net"
"os"
) func main() {
var addr string = "127.0.0.1:1234"
listenner, err := net.Listen("tcp", addr)
if err != nil{
fmt.Println("net.Listen err =", err)
return
}
defer listenner.Close() conn, errl := listenner.Accept()
if errl != nil{
fmt.Println("listenner.Accept err =", errl)
return
}
var n int
buf := make([]byte, 1024)
n, err = conn.Read(buf)
if err != nil{
fmt.Println("conn.Read fileName err =", err)
return
}
fileName := string(buf[:n])
n, err = conn.Write([]byte("ok"))
if err != nil{
fmt.Println("conn.Write ok err =", err)
return
} RecvFile(fileName, conn)
} func RecvFile(fileName string, conn net.Conn){
file , err := os.Create(fileName)
if err != nil{
fmt.Println("os.Create err =", err)
return
} defer file.Close() 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
} n, err = file.Write(buf[:n])
if err != nil{
fmt.Println("file.Write err =", err)
break
}
}
}

  

golang 文件传输小demo(转载)的更多相关文章

  1. golang 实现文件传输小demo

    获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者. 发送 ...

  2. golang文件传输服务

    续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...

  3. Spring Boot 简单小Demo 转载!!!

    Spring Boot简介 接下来我们所有的Spring代码实例将会基于Spring Boot,因此我们先来了解一下Spring Boot这个大杀器. Spring早期使用XML配置的方式来配置Spr ...

  4. c# 局域网文件传输实例

    一个基于c#的点对点局域网文件传输小案例,运行效果截图 //界面窗体 using System;using System.Collections.Generic;using System.Compon ...

  5. libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...

  6. go bigfile (文件传输管理系统)前端分片上传demo

    BIGFILE Github地址: https://github.com/bigfile/bigfile 欢迎大家前来issue & star BIGFILE 中文文档地址:https://l ...

  7. golang 远程传输文件

    概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...

  8. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  9. golang sftp传输文件

    之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件,还需要用 ...

随机推荐

  1. 【转载】C#中double.TryParse方法和double.Parse方法的异同之处

    在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...

  2. 因改漏洞而引申了解的Cookie机制!

    近期因为修改漏洞:Appscan扫描漏洞:加密会话(SSL)Cookie中缺少Secure属性,而涉及到Cookie有关的知识,现结合该漏洞的修复过程和了解的cookie知识总结一下. 一.加密会话( ...

  3. 个人项目 wc(java实现)

    一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...

  4. angularcli 第六篇(todolist 列表)

    1.通过文本框输入,向数组添加数据 <!-- 通过文本框输入,向数组添加数据 push --> <input type="text" name="111 ...

  5. 基于TCP协议的远程终端控制并发socketserver实现以及粘包问题处理

    # 客户端 # -*- coding: utf-8 -*- import socketserver import struct import json import subprocess class ...

  6. MySQL基础操作与数据类型

    目录 1.文件夹(库) 2.文件(表) 3.文件的一行内容 4.创建表的完整语法 5.整型类型 6.补充sql_mode 7.浮点型 8.字符类型 9.日期类型 10.枚举与集合类型 1.文件夹(库) ...

  7. linux下的 c 和 c++ 开发工具及linux内核开发工具

    https://opensource.com/article/18/6/embedded-linux-build-tools https://github.com/luong-komorebi/Awe ...

  8. 一小部分用python进行MD5加密的小技巧

    上个图 要求计算出开头为ae3da且盐值为3c6e的字符串 简单的思路就是直接进行枚举,然后筛选符合条件的MD5加密字符,代码如下 #-*- coding:utf- -*- import hashli ...

  9. redis启动异常处理一例

    rm -rf /var/log/redis/redis.log echo "net.core.somaxconn= 1024" >> /etc/sysctl.conf ...

  10. Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)

    题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...