client
package main
import (
"fmt"
"io"
"net"
"os"
)
func SendFile(filePath string, fileSize int64, conn net.Conn) {
f, err := os.Open(filePath)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
var count int64
for {
buf := make([]byte, 4<<10)
n, err := f.Read(buf)
if err != nil && io.EOF == err {
fmt.Println("文件传输完成")
conn.Write([]byte("finish"))
return
}
conn.Write(buf[:n])
count += int64(n)
sendPercent := float64(count) / float64(fileSize) * 100
value := fmt.Sprintf("%.2f", sendPercent)
fmt.Println("文件上传:" + value + "%")
}
}
func main() {
fmt.Print("请输入文件的完整路径:")
var str string
fmt.Scan(&str)
fileInfo, err := os.Stat(str)
if err != nil {
fmt.Println(err)
return
}
conn, err := net.Dial("tcp", ":8000")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
fileName := fileInfo.Name()
fileSize := fileInfo.Size()
conn.Write([]byte(fileName))
buf := make([]byte, 4<<10)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
revData := string(buf[:n])
if revData == "ok" {
SendFile(str, fileSize, conn)
}
}
server
package main
import (
"fmt"
"net"
"os"
)
func Handler(conn net.Conn) {
buf := make([]byte, 4<<10)
n, err := conn.Read(buf)
if err != nil {
fmt.Println(err)
return
}
fileName := string(buf[:n])
addr := conn.RemoteAddr().String()
fmt.Println(addr + ": 客户端传输的文件名为--" + fileName)
conn.Write([]byte("ok"))
f, err := os.Create(fileName)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
defer f.Close()
for {
buf := make([]byte, 4<<10)
n, _ := conn.Read(buf)
if string(buf[:n]) == "finish" {
fmt.Println(addr + ": 协程结束")
break
}
f.Write(buf[:n])
}
}
func main() {
listen, err := net.Listen("tcp", ":8000")
if err != nil {
fmt.Println(err)
return
}
defer listen.Close()
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println(err)
return
}
go Handler(conn)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界