当前位置: 首页 > wzjs >正文

交易网站建设微信小程序在哪里登录

交易网站建设,微信小程序在哪里登录,计算机技术员网站建设怎么,成都网站建设哪家专业主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。 “粘包"可发生在发送端也可发生在接收端: 由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法。简单来说就是当我们提交一段数据给…

主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。

“粘包"可发生在发送端也可发生在接收端:

  1. 由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法。简单来说就是当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。
  2. 接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据。

解决办法

出现"粘包"的关键在于接收方不确定将要传输的数据包的大小,因此我们可以对数据包进行封包和拆包的操作。

封包:封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了(过滤非法包时封包会加入"包尾"内容)。包头部分的长度是固定的,并且它存储了包体的长度,根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包。

我们可以自己定义一个协议,比如数据包的前4个字节为包头,里面存储的是发送的数据的长度。

protocol包:

package protocolimport ("bufio""bytes""encoding/binary"
)// Encode 将消息编码
func Encode(message string) ([]byte, error) {// 读取消息的长度,转换成int32类型(占4个字节)var length = int32(len(message))var pkg = new(bytes.Buffer)// 写入消息头err := binary.Write(pkg, binary.LittleEndian, length)if err != nil {return nil, err}// 写入消息实体err = binary.Write(pkg, binary.LittleEndian, []byte(message))if err != nil {return nil, err}return pkg.Bytes(), nil
}// Decode 解码消息
func Decode(reader *bufio.Reader) (string, error) {// 读取消息的长度lengthByte, _ := reader.Peek(4) // 读取前4个字节的数据lengthBuff := bytes.NewBuffer(lengthByte)var length int32err := binary.Read(lengthBuff, binary.LittleEndian, &length)if err != nil {return "", err}// Buffered返回缓冲中现有的可读取的字节数。if int32(reader.Buffered()) < length+4 {return "", err}// 读取真正的消息数据pack := make([]byte, int(4+length))_, err = reader.Read(pack)if err != nil {return "", err}return string(pack[4:]), nil
}

客户端:

func main() {conn, err := net.Dial("tcp", "127.0.0.1:30000")if err != nil {fmt.Println("dial failed, err", err)return}defer conn.Close()for i := 0; i < 20; i++ {msg := `Hello, Hello. How are you?`data, err := proto.Encode(msg)if err != nil {fmt.Println("encode msg failed, err:", err)return}conn.Write(data)}
}

服务器:

package mainimport ("bufio""fmt""io""net"proto "studygo/studygo/tcp/protocol""sync"
)var wg sync.WaitGroupfunc process(conn net.Conn) {//与客户端通信defer conn.Close()reader := bufio.NewReader(conn)for {msg, err := proto.Decode(reader)if err == io.EOF {break}if err!=nil{fmt.Println("decode msg failed,err:",err)return}fmt.Println(msg)}}func main() {//本地端口启动服务listener, err := net.Listen("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("listen failed,err:%v\n", err)return}defer listener.Close()for {//等待别人连接conn, err := listener.Accept()if err != nil {fmt.Println("accept failed,err:%v\n", err)return}go process(conn)}}

参考出处:Go语言基础之网络编程 | 李文周的博客

http://www.dtcms.com/wzjs/591062.html

相关文章:

  • win7 asp网站发布WordPress来应力
  • 餐饮加盟手机网站建设商城建设网站公司
  • 南宁网站建设索q.479185700网站app微信三合一
  • 办公用品十大购物网站排名wordpress自动安装
  • 建设网站时电商网站开发成本
  • 做网站的毕设用什么软件wordpress 权限插件
  • 关于百度网站的优缺点做网站框架浏览时怎么变长
  • 哪里有给网站做360百度营销
  • 网站图标代码温州网站建设网络
  • 云南省建设厅网站怎么进不去php网站架设教程
  • 拖拽自助建站系统源码吴忠网站建设
  • net网站开发 兼职app平台开发
  • jsp怎么做视频网站石狮网站定制
  • gif网站素材wordpress主题汉化中文
  • 中山做网站费用app 游戏网站建设
  • 福建企业网站建设做本地团购网站
  • 新乡营销型网站建设柳州市网站建设公司
  • 网站建设方案推销重庆专业seo
  • seo网站优化教程网站开发心得
  • 辽阳制作网站德惠网站建设
  • 网站办公室文化建设app多少钱能做一个
  • 在家开个代加工厂谷歌seo是什么职业
  • 如果将域名指向网站html网站开发教程
  • 汾湖做网站wordpress 防止爬虫
  • 惠安网站建设费用优化模型有哪些
  • 东莞好的网站国外站建设价格建设工程机械鉴定中心官网
  • 设计坞网站官方下载石家庄新闻头条新闻最新今天
  • 如何做网站快照网站结构设计
  • 旅游网网站的设计aws注册wordpress
  • 全屏网站制作深圳营销型网站建设推广服务