网站的布局有哪些/合肥网络公司seo建站

网站的布局有哪些,合肥网络公司seo建站,app开发制作哪里正规,资阳网站建设粘包问题详解:TCP协议中的常见问题及Go语言解决方案 一、什么是粘包问题? 粘包问题是指在TCP通信中,发送方发送的多个独立消息在接收方被合并成一个消息接收的现象。换句话说,发送方发送的多条消息在接收方被“粘”在一起&#…

粘包问题详解:TCP协议中的常见问题及Go语言解决方案

一、什么是粘包问题?

粘包问题是指在TCP通信中,发送方发送的多个独立消息在接收方被合并成一个消息接收的现象。换句话说,发送方发送的多条消息在接收方被“粘”在一起,导致接收方无法直接区分消息的边界。

1.1 粘包问题的成因

  • TCP是面向流的协议,它将数据视为一个连续的字节流,不保留消息的边界。
  • 发送方发送的多个消息可能被合并到同一个TCP包中发送。
  • 接收方在读取数据时,无法直接知道哪些字节属于哪条消息。

1.2 粘包问题的影响

  • 接收方无法正确解析消息,可能导致数据解析错误。
  • 系统的健壮性和可靠性降低,尤其是在需要严格消息边界的应用中。

二、粘包问题的示例

示例代码:发送方(Go语言)

package mainimport ("fmt""net"
)func main() {conn, err := net.Dial("tcp", "localhost:8080")if err != nil {fmt.Println("Error connecting:", err)return}defer conn.Close()_, err = conn.Write([]byte("Hello"))if err != nil {fmt.Println("Error writing:", err)return}_, err = conn.Write([]byte("World"))if err != nil {fmt.Println("Error writing:", err)return}conn.Close()
}

示例代码:接收方(Go语言)

package mainimport ("fmt""net"
)func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error listening:", err)return}defer listener.Close()conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting:", err)return}defer conn.Close()buffer := make([]byte, 1024)n, err := conn.Read(buffer)if err != nil {fmt.Println("Error reading:", err)return}fmt.Println("Received:", string(buffer[:n])) // 输出可能是 "HelloWorld"
}

在上述示例中,发送方发送了两条消息"Hello"和"World",但接收方可能接收到合并后的"HelloWorld",这就是粘包问题。

三、粘包问题的解决方案

3.1 固定长度法

  • 每条消息的长度固定,接收方根据固定长度来解析消息。
  • 优点:简单易实现。
  • 缺点:灵活性差,无法处理不同长度的消息。
// 发送方
package mainimport ("fmt""net"
)func main() {conn, err := net.Dial("tcp", "localhost:8080")if err != nil {fmt.Println("Error connecting:", err)return}defer conn.Close()// 填充到固定长度(例如10字节)msg1 := "Hello    "msg2 := "World    "_, err = conn.Write([]byte(msg1))if err != nil {fmt.Println("Error writing:", err)return}_, err = conn.Write([]byte(msg2))if err != nil {fmt.Println("Error writing:", err)return}conn.Close()
}// 接收方
package mainimport ("fmt""io""net"
)func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error listening:", err)return}defer listener.Close()conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting:", err)return}defer conn.Close()// 每条消息固定长度为10字节buffer := make([]byte, 10)for {n, err := io.ReadFull(conn, buffer)if err != nil {if err != io.EOF {fmt.Println("Error reading:", err)}break}fmt.Println("Received:", string(buffer[:n]))}
}

3.2 特殊分隔符法

  • 在每条消息末尾添加特殊分隔符(如\n\r\n),接收方通过分隔符来解析消息。
  • 优点:简单灵活。
  • 缺点:分隔符可能出现在消息内容中,导致解析错误。
// 发送方
package mainimport ("fmt""net"
)func main() {conn, err := net.Dial("tcp", "localhost:8080")if err != nil {fmt.Println("Error connecting:", err)return}defer conn.Close()// 添加换行符作为分隔符_, err = conn.Write([]byte("Hello\n"))if err != nil {fmt.Println("Error writing:", err)return}_, err = conn.Write([]byte("World\n"))if err != nil {fmt.Println("Error writing:", err)return}conn.Close()
}// 接收方
package mainimport ("bufio""fmt""net"
)func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error listening:", err)return}defer listener.Close()conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting:", err)return}defer conn.Close()reader := bufio.NewReader(conn)for {line, err := reader.ReadString('\n')if err != nil {if err.Error() != "EOF" {fmt.Println("Error reading:", err)}break}fmt.Println("Received:", line)}
}

3.3 消息头长度法

  • 消息头包含消息体的长度,接收方先读取消息头,再根据长度读取消息体。
  • 优点:灵活且高效。
  • 缺点:实现稍复杂。
// 发送方
package mainimport ("bytes""encoding/binary""fmt""net"
)func main() {conn, err := net.Dial("tcp", "localhost:8080")if err != nil {fmt.Println("Error connecting:", err)return}defer conn.Close()msg1 := "Hello"msg2 := "World"// 发送消息长度 + 消息内容sendMessage(conn, msg1)sendMessage(conn, msg2)conn.Close()
}func sendMessage(conn net.Conn, msg string) {// 消息长度(4字节)length := uint32(len(msg))buf := make([]byte, 4)binary.BigEndian.PutUint32(buf, length)// 发送长度_, err := conn.Write(buf)if err != nil {fmt.Println("Error writing length:", err)return}// 发送消息_, err = conn.Write([]byte(msg))if err != nil {fmt.Println("Error writing message:", err)return}
}// 接收方
package mainimport ("bytes""encoding/binary""fmt""io""net"
)func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println("Error listening:", err)return}defer listener.Close()conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting:", err)return}defer conn.Close()for {// 读取消息长度(4字节)lengthBuf := make([]byte, 4)_, err := io.ReadFull(conn, lengthBuf)if err != nil {if err != io.EOF {fmt.Println("Error reading length:", err)}break}length := binary.BigEndian.Uint32(lengthBuf)msgBuf := make([]byte, length)// 读取消息内容_, err = io.ReadFull(conn, msgBuf)if err != nil {if err != io.EOF {fmt.Println("Error reading message:", err)}break}fmt.Println("Received:", string(msgBuf))}
}

四、总结

粘包问题是TCP通信中的常见问题,其本质是TCP协议的面向流特性导致的消息边界丢失。解决粘包问题的方法主要有固定长度法、特殊分隔符法和消息头长度法。选择哪种方法取决于具体的应用场景和需求。如有错误之处烦请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG(Watchdog)看门狗看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢,结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但,又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

Linux之数据链路层

Linux之数据链路层 一.以太网1.1以太网帧格式1.2MAC地址1.3MTU 二.ARP协议2.1ARP协议工作流程2.2ARP协议格式 三.NAT技术四.代理服务4.1正向代理4.2反向代理 五.四大层的学习总结 一.以太网 在我们学习完了网络层后我们接下来就要进入数据链路层的学习了,在学习完网…

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数(如下): 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

全新版租赁商城小程序源码系统 源码开源支持二开+图文搭建教程

在互联网商业的浪潮中,租赁业务凭借其独特的优势,正逐渐成为市场的新宠。对于开发者而言,快速搭建一个功能完备的租赁商城小程序,不仅能满足市场需求,还能为自己的业务拓展带来新的机遇。分享一款全新版租赁商城小程序…

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0,出现了一些问题:无法删除,包括:知识库中的文件、应用、智能体、工作流,都无法删除。现在把服务器初始化,一步步重新安装,从0到有。 目录 1、服务器重装系统和配置…

AI的未来:机遇、挑战与发展方向

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 人工智能(AI)已经成为当今世界最具革命性的技术之一,它正在深刻改变各个行业&#x…

使用vue cli 5.0 在vscode中运行vue命令报错

1、运行 vue -- version 报错 2、在cmd 命令行 执行 vue --version 正常 3、在终端中输入 get-ExecutionPolicy,查看当前权限 4、执行 set-executionpolicy remotesigned 命令设置为可用模式,但是报错 5、使用管理员打开power shell 执行 G…

瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记

一、源码 官方在librga中给了很多 demo 以供参考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…

06-SpringBoot3入门-常见注解(简介)

1、Controller ResponseBody Controller是Spring MVC 中的注解&#xff0c;负责处理 HTTP 请求。 ResponseBody是Spring MVC 中的注解&#xff0c;用于直接将方法的返回值作为 HTTP 响应体。 2、RestController RestController Controller ResponseBody 3、RequestMappin…

ubuntu24.04.2 NVIDIA GeForce RTX 4060笔记本安装驱动

https://www.nvidia.cn/drivers/details/242281/ 上面是下载地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 赋予执行权限把下载的驱动复制到家目录下&#xff0c;基本工具准备&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …

《Express:Node.js 里的 “闪电侠”》

“你就坐在我身边&#xff0c;好不好” 什么是Express 官方给出的概念&#xff1a;Express 是基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架。 通俗的理解&#xff1a;Express 的作用和 Node.js 内置的 http 模块类似&#xff0c;是专门用来创建 Web 服务器…

vue遗漏的知识点(动态组件.组件库的操作使用)

----动态组件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的内置组件&#xff0c;用于动态渲染其他组件。:is 属性 用于指定要渲染的组件。它的值可以是&#xff1a; 组件的名称&#xff08;字符串&#xf…

vue 项目启动报错可以让 cursor启动

vue 项目启动报错可以让 cursor启动

Vue3当中el-tree树形控件使用

tree悬停tooltip效果 文本过长超出展示省略号 如果文本超出悬停显示tooltip效果 反之不显示 这里直接控制固定宽度限制 试了监听宽度没效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…

PDF处理控件Aspose.PDF教程:通过C#、Java 和 Python删除 PDF中的水印

Aspose.PDF 是一个功能强大的库&#xff0c;旨在以编程方式处理 PDF 文档&#xff0c;提供创建、编辑、转换和操作的广泛功能。它支持 C#、Java 和 Python 等多种编程语言&#xff0c;使开发人员能够精确高效地自动处理 PDF。 对于开发人员来说&#xff0c;由于自动化和定制化…

基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)

摘 要 随着我国经济的飞速发展&#xff0c;促使各种能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油资源不断消耗与短缺&#xff0c;因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点&#xff0c;且分布范围广&…

【硬件测试】基于FPGA的16QAM+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

目录 1.算法硬件测试效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法硬件测试效果 本文是之前写的文章: 《基于FPGA的16QAM帧同步系统verilog开发,包含testb…

多路径 TCP 调度的另一面

参考前面的文章 一个原教旨的多路径 TCP 和 MP-BBR 公平性推演&#xff0c;一直都破而不立&#xff0c;不能光说怎样不好&#xff0c;还得说说现状情况下&#xff0c;该如何是好。 如果 receiver 乱序重排的能力有限(拜 TCP 所赐)&#xff0c;如果非要在多路径上传输 TCP&…