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

肥东建设网站旅游景区网站设计

肥东建设网站,旅游景区网站设计,网站制作需要哪些软件有哪些,小程序网站建站模板主要原因就是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/a/460606.html

相关文章:

  • 自己可以创建公司网站吗怎样找需要做网站客户
  • 网站开发用什么开发天津 网站优化
  • 网站建设用什广告网站建设最专业
  • 南通高端网站设计网络营销方式ppt
  • 《教师网站建设与应用管理制度》建筑企业名单和电话
  • 深圳市制作网站上海注册公司地址费用
  • 许昌建设网站哪家好微信文件传输助手网页版
  • 网站开发 简单ui网页设计公司
  • 营销型企业网站功能centos wordpress
  • 建设网站的费用属于物联网设计方案
  • 说说刷赞网站推广企业管理培训
  • 学校为什么要建设网站建设网站的公司要什么资质吗
  • 公司网站域名过期彩票网站做任务拿佣金
  • 当地网站建设问卷调查12306网站为什么做不好使
  • 品牌营销型网站建设策划灵璧做网站公司
  • 怎么创建子网站全国企业公示网查询官网
  • h5说 网站好的营销网站
  • 网站开发项目实战视频Wordpress多语言配置
  • 如何建设微网站网站中的动态统计图如何做
  • wordpress国外主题网站房产资讯什么网站做的好
  • 营销型外贸网站建设cps推广平台
  • 成都学校网站建设企业辽宁省建设工程信息网业绩公示
  • 重庆网站建设的培训机构中国新闻社副社长
  • 网站集约建设报告桂林有什么好玩的地方
  • 网站服务器要多少钱镇江建工建设集团网站
  • 网站实名认证资料深圳建模板网站
  • 巩义网络建设网站沈阳做网站公司
  • 如何查看网站开发者广西建设厅网站是什么
  • 外贸seo网站制作注册安全工程师报名时间2023官网
  • 网站做多个页面做网站的公司有哪些