server端:

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "encoding/binary"
  6. "fmt"
  7. "net"
  8. "os"
  9. "unsafe"
  10. )
  11.  
  12. func SHandleError(err error, when string) {
  13. if err != nil{
  14. fmt.Println("服务端异常退出,err=", err, when)
  15. os.Exit(1)
  16. }
  17. }
  18.  
  19. func BytesToInt64(buf []byte) int64 {
  20. return int64(binary.BigEndian.Uint64(buf))
  21. }
  22.  
  23. func main() {
  24. //建立tcp监听
  25. listener, e := net.Listen("tcp", ":8080")
  26. SHandleError(e, "net.Listen")
  27. defer func() {
  28. listener.Close()
  29. fmt.Println("服务端正常退出")
  30. }()
  31.  
  32. //接受客户端请求,建立会话专线Conn
  33. conn, e := listener.Accept()
  34. SHandleError(e, "listener.Accept")
  35. defer func() {
  36. conn.Close()
  37. fmt.Printf("已断开与%v的链接\n", conn.RemoteAddr())
  38. }()
  39.  
  40. dstFile, e := os.OpenFile(`meinv1.mp4`, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
  41. writer := bufio.NewWriter(dstFile)
  42. defer dstFile.Close()
  43. buffer := make([]byte, 100)
  44. total := 0
  45.  
  46. //接受客户端发来的要传文件大小
  47. buffer2 := make([]byte, 10)
  48. m, e := conn.Read(buffer2)
  49. //size := string(buffer2[:m])
  50. //fmt.Printf("%s\n",size)
  51. //i, _ := strconv.Atoi(size)
  52.  
  53. //[]byte转换为int64
  54. i := BytesToInt64(buffer2[:m])
  55. fmt.Printf("%d, %T\n",i,i)
  56. //int64转换为int
  57. j := *(*int)(unsafe.Pointer(&i))
  58. fmt.Printf("%d, %T\n",j,j)
  59.  
  60. for {
  61. //接受客户端上传的文件
  62. n, e := conn.Read(buffer)
  63. SHandleError(e, "conn.Read")
  64. total += n
  65.  
  66. //写入服务端本地文件
  67. writer.Write(buffer[:n])
  68. writer.Flush()
  69.  
  70. fmt.Printf("成功写入%d个字节,共%d字节\n", n, total)
  71.  
  72. //如果实际总接受字节数与客户端给的要传输字节数相等,说明传输完毕
  73. if total == j{
  74. fmt.Println("文件接受成功,共",total,"字节")
  75. //回复客户端已收到文件
  76. conn.Write([]byte("文件接受成功"))
  77. break
  78. }
  79. }
  80. }

client端:

  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "encoding/binary"
  6. "fmt"
  7. "io"
  8. "net"
  9. "os"
  10. "time"
  11. )
  12.  
  13. /*
  14. ·实现tcp文件上传功能
  15. */
  16.  
  17. func CHandleError2(err error, when string) {
  18. if err != nil {
  19. fmt.Println("客户端异常退出:err=", err, when)
  20. os.Exit(1)
  21. }
  22. }
  23. func Int64ToBytes(i int64) []byte {
  24. var buf = make([]byte, 8)
  25. binary.BigEndian.PutUint64(buf, uint64(i))
  26. return buf
  27. }
  28. func main() {
  29. conn, e := net.Dial("tcp", "127.0.0.1:8080")
  30. CHandleError2(e, "net.Dial")
  31.  
  32. defer func() {
  33. conn.Close()
  34. fmt.Println("客户端正常退出")
  35. }()
  36.  
  37. //获取目标文件的大小,传给服务端
  38. fileInfo, _ := os.Stat(`perfect.mp4`)
  39. size := fileInfo.Size()
  40. bytes := Int64ToBytes(size)
  41. conn.Write(bytes)
  42.  
  43. //暂时通过客户端sleep 200毫秒解决粘包问题,还可以通过tcp重连解决,以后再用(包头+数据)封装数据包的方式解决
  44. time.Sleep(time.Millisecond * 200)
  45.  
  46. buffer := make([]byte, 100)
  47. srcFile, _ := os.Open(`perfect.mp4`)
  48. reader := bufio.NewReader(srcFile)
  49. total := 0
  50. for {
  51. n, err := reader.Read(buffer)
  52. fmt.Println(n, err)
  53. if err == io.EOF{
  54. fmt.Println("文件发送完毕")
  55. fmt.Println(total)
  56. break
  57. }else {
  58. _, e = conn.Write(buffer[:n])
  59. total += n
  60. CHandleError2(e, "conn.Write")
  61. }
  62. }
  63.  
  64. n, e := conn.Read(buffer)
  65. CHandleError2(e, "conn.Read")
  66. replyMsg := buffer[:n]
  67. fmt.Println("服务端:", string(replyMsg))
  68. }

  

Go语言网络通信---tcp上传大文件(粘包问题还需优雅解决)的更多相关文章

  1. tcp上传大文件举例、udp实现qq聊天、socketserver模块实现并发

    为什么会出现粘包现象(day31提到过,这里再举个例子) """首先只有在TCP协议中才会出现粘包现象,因为TCP协议是流式协议它的特点是将数据量小并且时间间隔比较短的数 ...

  2. [Asp.net]Uploadify上传大文件,Http error 404 解决方案

    引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章:[Asp.net]Upl ...

  3. php 上传大文件配置upload_max_filesize和post_max_size选项

    php 上传大文件配置upload_max_filesize和post_max_size选项 (2014-04-29 14:42:11) 转载▼ 标签: php.ini upload _files[f ...

  4. PHP上传大文件 分割文件上传

    最近遇到这么个情况,需要将一些大的文件上传到服务器,我现在拥有的权限是只能在一个网页版的文件管理系统来进行操作,可以解压,可以压缩,当然也可以用它来在线编辑.php文件. 文件有40M左右,但是服务器 ...

  5. ASP.NET上传大文件的问题

    原文:http://www.cnblogs.com/wolf-sun/p/3657241.html?utm_source=tuicool&utm_medium=referral 引言 之前使用 ...

  6. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

    php 上传大文件主要涉及配置 upload_max_filesize 和post_max_size两个选项   今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了 ...

  7. SWFUpload上传大文件(暂时用用,真正用的时候还是要改的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. PHP上传大文件和处理大数据

    1. 上传大文件 /* 以1.5M/秒的速度写入文件,防止一次过写入文件过大导致服务器出错(chy/20150327) */ $is_large_file = false; if( strlen($x ...

  9. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

随机推荐

  1. Django+Vue+Docker搭建接口测试平台实战

    一. 开头说两句 大家好,我叫林宗霖,是一位测试工程师,也是全栈测开训练营中的一名学员. 在跟着训练营学习完Docker容器技术系列的课程后,理所应当需要通过实操来进行熟悉巩固.正好接口自动化测试平台 ...

  2. RandomForestClassifier参数

    [RandomForestClassifier] 参数 n_estimators : 随机森林中树的个数,即学习器的个数. max_features : 划分叶子节点,选择的最大特征数目 n_feat ...

  3. mooc人大单元测试4

    @font-face { font-family: Wingdings } @font-face { font-family: 宋体 } @font-face { font-family: " ...

  4. 【MySQL】Mysql(InnoDB引擎) 索引的数据结构为什么选择B+Tree

    1.B+ Tree的层数较少 B类树的一个很鲜明的特点就是数的层数比较少,而每层的节点非常多,树的每个叶子节点到根节点的距离都是相同的: 2.   减少磁盘IO: 树的每一个节点都是一个数据也,这样每 ...

  5. 【Idea】实用的快捷键清单

    1.Ctrl + Shift +i:快速查看某个类/方法 2.Ctrl +:(Ace Jump插件启动) 3.alt+F1:快速查看某个类/方法 所在的包 4.Ctrl +w :选中某个单词 5.Ct ...

  6. hdu1024 最大m子序列和

    题意:      给你一个序列n个数组成,然后让你在里面找到m个子序列,让这m个子序列的和最大. 思路:       dp[i][j]表示的是第j个数字在第i个子序列时的当前最优值. dp[i][j] ...

  7. 票据传递攻击(Pass the Ticket,PtT)

    目录 黄金票据 生成票据并导入 查看票据 验证是否成功 黄金票据和白银票据的不同 票据传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法.PtT最常见的用途可能是使用黄金 ...

  8. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  9. java之I/O流

    I/O流的使用情况多种多样,首先它的数据源就可能是文件.控制台.服务器等,它的单位可能是按字节.按字符.按行等.为了涵盖所有的可能,java类库中创建了大量的类,如此多的类让我们在使用时感觉有点难以选 ...

  10. 解决移动端300ms延迟fastclick

    为什么要使用fastclick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了fastclick. f ...