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)
   }
}
原文地址:https://www.cnblogs.com/lijiasnong/p/14032223.html