要实现P2P文件互传,可以使用Golang的net包和os包。以下是一个简单的代码示例:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 获取命令行参数
if len(os.Args) != 3 {
fmt.Printf("Usage: %s <addr> <file>\n", os.Args[0])
os.Exit(1)
}
addr := os.Args[1]
filename := os.Args[2]
// 打开文件
file, err := os.Open(filename)
if err != nil {
fmt.Println("Error opening file:", err)
os.Exit(1)
}
defer file.Close()
// 创建TCP连接
conn, err := net.Dial("tcp", addr)
if err != nil {
fmt.Println("Error connecting:", err)
os.Exit(1)
}
defer conn.Close()
// 发送文件名
_, err = conn.Write([]byte(filename))
if err != nil {
fmt.Println("Error sending filename:", err)
os.Exit(1)
}
// 发送文件内容
buf := make([]byte, 1024)
for {
n, err := file.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("Error reading file:", err)
os.Exit(1)
}
if n == 0 {
break
}
_, err = conn.Write(buf[:n])
if err != nil {
fmt.Println("Error sending file:", err)
os.Exit(1)
}
}
}
这个程序使用TCP协议,在命令行中指定目标地址和文件名,然后将文件内容发送给目标地址。接收方的程序需要监听TCP连接并接收传输过来的文件名和文件内容。
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
// 获取命令行参数
if len(os.Args) != 2 {
fmt.Printf("Usage: %s <port>\n", os.Args[0])
os.Exit(1)
}
port := os.Args[1]
// 开始监听TCP连接
listener, err := net.Listen("tcp", ":"+port)
if err != nil {
fmt.Println("Error listening:", err)
os.Exit(1)
}
defer listener.Close()
for {
// 等待连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
// 接收文件名
filenameBuf := make([]byte, 1024)
n, err := conn.Read(filenameBuf)
if err != nil && err != io.EOF {
fmt.Println("Error receiving filename:", err)
conn.Close()
continue
}
filename := string(filenameBuf[:n])
// 创建文件
file, err := os.Create(filename)
if err != nil {
fmt.Println("Error creating file:", err)
conn.Close()
continue
}
// 接收文件内容
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("Error receiving file:", err)
conn.Close()
break
}
if n == 0 {
break
}
_, err = file.Write(buf[:n])
if err != nil {
fmt.Println("Error writing file:", err)
conn.Close()
break
}
}
// 关闭连接和文件
conn.Close()
file.Close()
}
}
这个程序先监听TCP连接,接收到连接后等待传输过来的文件名和文件内容。然后创建文件并将数据写入文件中。当传输完成后关闭连接和文件,等待下一个连接。
注意,这个示例非常简单,并没有考虑网络错误、文件不存在等异常情况。在实际开发中,需要对这些异常情况进行处理。另外,对于大文件的传输,可以使用分片上传的方式,避免一次性传输过大的文件。