首页 > 其他分享 >file-server

file-server

时间:2022-10-21 12:55:47浏览次数:37  
标签:err fmt server buffer3 file total conn 客户端

package main

import (
    "bufio"
    "encoding/binary"
    "fmt"
    "net"
    "os"
    "unsafe"
)

func SHandleError(err error, when string)  {
    if err != nil{
        if  when == "conn.Read" {
           fmt.Println("读取客户端数据异常,客户端断开")
        }else{
        fmt.Println("服务端异常退出,err=", err, when)
        os.Exit(1)
        }
    }
}

func BytesToInt64(buf []byte) int64 {
    return int64(binary.BigEndian.Uint64(buf))
}
func HandleConn(conn net.Conn) {
    defer func() {
        conn.Close()
        fmt.Printf("已断开与%v的链接\n", conn.RemoteAddr())
    }()
    //接受客户端发来的要传文件大小
    buffer2 := make([]byte, 10)
    m, e := conn.Read(buffer2)
    SHandleError(e, "listener.Accept")
    //[]byte转换为int64
    i := BytesToInt64(buffer2[:m])
    //int64转换为int
    j := *(*int)(unsafe.Pointer(&i))
    fmt.Printf("%d, %T\n",j,j)
 
    //接受客户端发来的要传文件名称字符串
    buffer3 := make([]byte, 1000)
    m1, _ := conn.Read(buffer3)
    fmt.Printf("%s \n",buffer3[:m1])
    fmt.Printf(string(buffer3[:m1]))

    dstFile, e := os.OpenFile(string(buffer3[:m1]), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
    writer := bufio.NewWriter(dstFile)
    defer dstFile.Close()
    buffer := make([]byte, 512)
    total := 0

    for {
        //接受客户端上传的文件
        n, e := conn.Read(buffer)
        if e != nil {
          fmt.Println("读取客户端数据异常,客户端断开")
          break
        }
        total += n
        //写入服务端本地文件
        writer.Write(buffer[:n])
        writer.Flush()
        fmt.Printf("成功写入%d字节, 共%d字节, 进度 %d \n", n, total, 100*total/j)
        //如果实际总接受字节数与客户端给的要传输字节数相等,说明传输完毕
        if total == j{
            fmt.Println("文件接受成功,共",total,"字节: ", string(buffer3[:m1]))
            //回复客户端已收到文件
            conn.Write([]byte("文件接受成功"))
            break
        }
    }
}

func main() {
    listen, e := net.Listen("tcp", "0.0.0.0:8081")
    SHandleError(e, "net.Listen")
    defer func() {
        listen.Close()
        fmt.Println("服务端正常退出")
    }()
    for {
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println(err)
            continue   // 继续监听
        }
        go HandleConn(conn)
    }
}

标签:err,fmt,server,buffer3,file,total,conn,客户端
From: https://www.cnblogs.com/ah-firelove/p/16813100.html

相关文章

  • 文件流 FileStream
    FileStream类System.IO命名空间中的 FileStream 类有助于文件的读写与关闭。该类派生自抽象类Stream。您需要创建一个 FileStream 对象来创建一个新的文件,或打开......
  • SQL Server 2008 R2占用内存越来越大两种解决方法
    事件缘由:本人在开发sqlserver数据库项目的过程中发现了这么一个问题,SQLServer2008R2运行越久,占用内存会越来越大。因为sql server 2008 本身内存回收机制做的不好 ......
  • FileChooser文件保存样例
    FileChooserfc=newFileChooser();fc.setTitle("请选择文件保存位置");fc.setInitialDirectory($原始文件位置$);//桌面位置privatefinalstaticFilehomeDirecto......
  • ubuntu-22.04.1-live-server-amd64 安装教程
     下载U盘工具  go下载iso镜像  go https://releases.ubuntu.com/22.04/ubuntu-22.04.1-live-server-amd64.iso启动盘制作电脑U盘启动安装系统选硬盘......
  • Blazor组件自做十一 : File System Access 文件系统访问 组件
    BlazorFileSystemAccess文件系统访问组件Web应用程序与用户本地设备上的文件进行交互FileSystemAccessAPI(以前称为NativeFileSystemAPI,在此之前称为Writea......
  • File类操作
    File类的常用方法创建文件File.Create(@"文件路径");1删除文件File.Delete(@"文件路径");1复制文件File.Copy("被复制文件路径","新文件路径");1剪切文件File.Move("......
  • 解决004--Loading local data is disabled; this must be enabled on both the client
    因为下载了SQLyog的ultimate版本,现在就可以导入外部的数据了。有着之前使用insertinto插入语句来添加近50条有着大概10个字段的记录的经历之后,本着能够导入现成的数据就导......
  • Makefile
    MAKEFILE学习视频地址:https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=2&vd_source=305f791c703672cea3129189ddda734f目标:一般指要编译的目标,也可以是一个动作依赖:指执行......
  • File转MultipartFile
    /***功能描述:File转MultipartFile**@paramfileFile类型文件*@return{@linkorg.springframework.web.multipart.MultipartFile}......
  • SQL Server中,Numric,Decimal,Money三种字段类型的区别
     SQLServer中,Numric,Decimal,Money三种字段类型的区别 1,Numric,Decimal,Money三种字段类型,都是精确数据类型;前两个可以自己定义长度和小数位数,Money的定义相当于......