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)
   }
}
复制代码

 

posted @   steven.木子  阅读(135)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2015-11-24 Centos7 设置IPtables
点击右上角即可分享
微信分享提示