golang tcp传输文件代码
时间: 2024-01-19 08:03:47 浏览: 111
以下是一个简单的基于TCP协议传输文件的示例代码,使用Go语言实现:
```go
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
// 监听端口
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
defer listener.Close()
fmt.Println("Listening on port 8080...")
// 无限循环接受客户端连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
continue
}
// 处理客户端请求
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
// 读取客户端传来的文件名
fileName := make([]byte, 1024)
_, err := conn.Read(fileName)
if err != nil {
fmt.Println("Error reading file name:", err.Error())
return
}
// 创建文件
file, err := os.Create(string(fileName))
if err != nil {
fmt.Println("Error creating file:", err.Error())
return
}
defer file.Close()
// 循环读取客户端传来的数据并写入文件
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Println("Error reading file:", err.Error())
}
break
}
_, err = file.Write(buf[:n])
if err != nil {
fmt.Println("Error writing file:", err.Error())
break
}
}
fmt.Println("File transfer complete.")
}
```
客户端发送文件的代码可以参考以下示例:
```go
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
// 连接服务器
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println("Error connecting:", err.Error())
os.Exit(1)
}
defer conn.Close()
// 发送文件名
fileName := "test.txt"
_, err = conn.Write([]byte(fileName))
if err != nil {
fmt.Println("Error sending file name:", err.Error())
return
}
// 打开文件
file, err := os.Open(fileName)
if err != nil {
fmt.Println("Error opening file:", err.Error())
return
}
defer file.Close()
// 循环读取文件并发送数据
buf := make([]byte, 1024)
for {
n, err := file.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Println("Error reading file:", err.Error())
}
break
}
_, err = conn.Write(buf[:n])
if err != nil {
fmt.Println("Error sending file data:", err.Error())
break
}
}
fmt.Println("File transfer complete.")
}
```
以上代码仅供参考,实际使用时需要注意安全性和错误处理。
阅读全文