基于 tcp 网络的文件读写案例,反复演练 c-s 通信过程。
专栏的介绍可以参考 《CaseGolang专栏》,代码可以看《宝库-case》。
流程和原理设计如下:
流程比较清晰,代码也比较简单,直接贴在下面了: 已经上传 github.
客户端代码: client.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| func main() { list := os.Args if len(list) != 2 { fmt.Println("usage : ./client filePath") return }
filePath := list[1]
info, err := os.Stat(filePath) if err != nil { fmt.Println("err = ", err) return }
conn, err1 := net.Dial("tcp", "127.0.0.1:8000") if err1 != nil { fmt.Println("dial error : ", err1) return } defer conn.Close()
_, err = conn.Write([]byte(info.Name())) if err != nil { fmt.Println("conn Write server err : ", err) return }
var n int buf := make([]byte, 1024) n, err = conn.Read(buf) if err != nil { fmt.Println("conn.Read err = ", err) return } if "ok" == string(buf[:n]) { sendFile(filePath, conn) } }
func sendFile(filePath string, conn net.Conn) { f, err := os.Open(filePath) if err != nil { fmt.Println("os.Open err = ", err) return } defer f.Close()
buf := make([]byte, 1024*4) for { n, err := f.Read(buf) if err != nil { if err == io.EOF && n ==0 { fmt.Println("文件发送完毕") } else { fmt.Println("f.Read err = ", err) } return } conn.Write(buf[:n]) }
}
|
服务端代码: server.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| func main() { listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Listen err =", err) return } defer listener.Close()
conn, err1 := listener.Accept() if err1 != nil { fmt.Println("listener.Accept err = ", err1) return } defer conn.Close()
buf := make([]byte, 1024) var n int n, err = conn.Read(buf) if err != nil { fmt.Println("conn Read err = ", err1) return }
fileName := string(buf[:n]) conn.Write([]byte("ok"))
recvFile(fileName, conn) }
func recvFile(fileName string, conn net.Conn) { f ,err := os.Create(fileName) if err != nil { fmt.Println("create file err = ", err) return } defer f.Close()
buf := make([]byte, 1024*4)
for{ n, err := conn.Read(buf) if err != nil && err != io.EOF { fmt.Println("conn.Read err = ", err) } if n == 0 { fmt.Println("文件接收完毕") return } f.Write(buf[:n]) } }
|
运行结果如下:
Merlin 上传 tcp 案例