• sockt文件传输


    Server:
    package main
    
    import (
       "fmt"
       "io"
       "net"
       "os"
    )
    
    //接收文件内容
    func RecvFile(fileName string, conn net.Conn) {
       //新建一个文件
       f, err := os.Create(fileName)
       if err != nil {
          fmt.Println("os.Create err = ", err)
          return
       }
       buf := make([]byte, 4*1024)
       for true {
          n, err := conn.Read(buf) //接收对方发过来的文件内容
          if err != nil {
             if err == io.EOF {
                fmt.Println("文件接收完毕")
                break
             } else {
                fmt.Println("f.read err = ", err)
                return
             }
          }
          f.Write(buf[:n])
       }
    }
    
    func main() {
       //监听
       listener, err := net.Listen("tcp", ":8000")
       if err != nil {
          fmt.Println("net.Listen err = ", err)
          return
       }
    
       defer listener.Close()
    
       conn, err := listener.Accept()
       if err != nil {
          fmt.Println("listener.Accept err = ", err)
          return
       }
       //读取文件名
       buf := make([]byte, 1024)
       var n int
       n, err = conn.Read(buf)
       if err != nil {
          fmt.Println("conn read err = ", err)
          return
       }
       fileName := string(buf[:n])
       //回复OK
       conn.Write([]byte("ok"))
    
       //接收文件内容
       RecvFile(fileName, conn)
    }
    
    
    Client:
    package main
    
    import (
       "fmt"
       "io"
       "net"
       "os"
    )
    
    //发送文件内容
    func SendFile(path string, conn net.Conn) {
       //以只读方式打开文件
       f, err := os.Open(path)
       if err != nil {
          fmt.Println("open file err = ", err)
          return
       }
       defer f.Close()
       //核心功能,读多少就发送多少
       buf := make([]byte, 2048)
       for true {
          n, err := f.Read(buf)
          if err != nil {
             if err == io.EOF {
                fmt.Println("文件发送完毕")
                return
             } else {
                fmt.Println("f.read err = ", err)
                return
             }
          }
          //给服务器发送内容
          conn.Write(buf[:n])
       }
    }
    
    func main() {
       //提示输入文件
       fmt.Println("请输入需要传输的文件:")
       var path string
       fmt.Scan(&path)
    
       //获取文件名
       info, err := os.Stat(path)
       if err != nil {
          fmt.Print("获取文件名err = ", err)
          return
       }
       //文件连接服务器
       conn, err1 := net.Dial("tcp", ":8000")
       if err1 != nil {
          fmt.Println("net.Dial err = ", err1)
          return
       }
    
       defer conn.Close()
    
       //给接收方发送文件名
       _, err = conn.Write([]byte(info.Name()))
       if err != nil {
          fmt.Println("conn.Write err = ", err)
          return
       }
       buf := make([]byte, 1024)
       n, err := conn.Read([]byte(buf))
       if err != nil {
          fmt.Println("conn.Read err = ", err)
       }
       if "ok" == string(buf[:n]) {
          fmt.Println("开始发送文件了")
          //发送文件
          SendFile(path, conn)
       }
    }
  • 相关阅读:
    Linux RAID部署
    系统运维架构师体系
    Linux系统上文件的特殊权限及文件acl
    Linux磁盘使用及文件系统管理
    中小规模网站架构组成
    优化配置模板主机
    网络原理基础
    MySQL二进制安装
    网络通讯基础
    点击改变背景
  • 原文地址:https://www.cnblogs.com/lijiasnong/p/14032223.html
Copyright © 2020-2023  润新知