ZBLOG

golang 编写P2P文件互传

要实现P2P文件互传,可以使用Golang的net包和os包。以下是一个简单的代码示例:

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. )
  7. func main() {
  8. // 获取命令行参数
  9. if len(os.Args) != 3 {
  10. fmt.Printf("Usage: %s <addr> <file>\n", os.Args[0])
  11. os.Exit(1)
  12. }
  13. addr := os.Args[1]
  14. filename := os.Args[2]
  15. // 打开文件
  16. file, err := os.Open(filename)
  17. if err != nil {
  18. fmt.Println("Error opening file:", err)
  19. os.Exit(1)
  20. }
  21. defer file.Close()
  22. // 创建TCP连接
  23. conn, err := net.Dial("tcp", addr)
  24. if err != nil {
  25. fmt.Println("Error connecting:", err)
  26. os.Exit(1)
  27. }
  28. defer conn.Close()
  29. // 发送文件名
  30. _, err = conn.Write([]byte(filename))
  31. if err != nil {
  32. fmt.Println("Error sending filename:", err)
  33. os.Exit(1)
  34. }
  35. // 发送文件内容
  36. buf := make([]byte, 1024)
  37. for {
  38. n, err := file.Read(buf)
  39. if err != nil && err != io.EOF {
  40. fmt.Println("Error reading file:", err)
  41. os.Exit(1)
  42. }
  43. if n == 0 {
  44. break
  45. }
  46. _, err = conn.Write(buf[:n])
  47. if err != nil {
  48. fmt.Println("Error sending file:", err)
  49. os.Exit(1)
  50. }
  51. }
  52. }

这个程序使用TCP协议,在命令行中指定目标地址和文件名,然后将文件内容发送给目标地址。接收方的程序需要监听TCP连接并接收传输过来的文件名和文件内容。

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "os"
  7. )
  8. func main() {
  9. // 获取命令行参数
  10. if len(os.Args) != 2 {
  11. fmt.Printf("Usage: %s <port>\n", os.Args[0])
  12. os.Exit(1)
  13. }
  14. port := os.Args[1]
  15. // 开始监听TCP连接
  16. listener, err := net.Listen("tcp", ":"+port)
  17. if err != nil {
  18. fmt.Println("Error listening:", err)
  19. os.Exit(1)
  20. }
  21. defer listener.Close()
  22. for {
  23. // 等待连接
  24. conn, err := listener.Accept()
  25. if err != nil {
  26. fmt.Println("Error accepting connection:", err)
  27. continue
  28. }
  29. // 接收文件名
  30. filenameBuf := make([]byte, 1024)
  31. n, err := conn.Read(filenameBuf)
  32. if err != nil && err != io.EOF {
  33. fmt.Println("Error receiving filename:", err)
  34. conn.Close()
  35. continue
  36. }
  37. filename := string(filenameBuf[:n])
  38. // 创建文件
  39. file, err := os.Create(filename)
  40. if err != nil {
  41. fmt.Println("Error creating file:", err)
  42. conn.Close()
  43. continue
  44. }
  45. // 接收文件内容
  46. buf := make([]byte, 1024)
  47. for {
  48. n, err := conn.Read(buf)
  49. if err != nil && err != io.EOF {
  50. fmt.Println("Error receiving file:", err)
  51. conn.Close()
  52. break
  53. }
  54. if n == 0 {
  55. break
  56. }
  57. _, err = file.Write(buf[:n])
  58. if err != nil {
  59. fmt.Println("Error writing file:", err)
  60. conn.Close()
  61. break
  62. }
  63. }
  64. // 关闭连接和文件
  65. conn.Close()
  66. file.Close()
  67. }
  68. }

这个程序先监听TCP连接,接收到连接后等待传输过来的文件名和文件内容。然后创建文件并将数据写入文件中。当传输完成后关闭连接和文件,等待下一个连接。

注意,这个示例非常简单,并没有考虑网络错误、文件不存在等异常情况。在实际开发中,需要对这些异常情况进行处理。另外,对于大文件的传输,可以使用分片上传的方式,避免一次性传输过大的文件。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1464

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?