zoukankan      html  css  js  c++  java
  • 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)
       }
    }
  • 相关阅读:
    《当程序员的那些狗日日子》(五十五)另一种生存之道
    "泄密"之秘 互联网最大规模用户资料泄露事件真相
    《当程序员的那些狗日日子》(五十九)凤凰涅磐
    《当程序员的那些狗日日子》(五十七)迟来的爱恋
    《当程序员的那些狗日日子》(六十)大海作证
    PHP开发者常犯的10个MySQL错误
    《当程序员的那些狗日日子》(五十八)盼望已久的收获
    Javascript 面向对象编程
    图片搜索引擎图像识别匹配的原理(二)
    如何做到 jQueryfree?
  • 原文地址:https://www.cnblogs.com/lijiasnong/p/14032223.html
Copyright © 2011-2022 走看看