TCP通信数据接收栈实现

很惭愧TCP/IP协议卷一还没有看完,实在是毅力问题。

在使用TCP的时候一向怀疑数据是否能够完整接受,先发送一个"hello"字符串后再发送一个“world”字符串,可能就会在你不知道的时候底层开始进行包的重组,重组成

"hellowo"和"rld"两个字符串。特别是在数据发送频繁,和网络延时的时候.如果你在接受方直接recv()缓冲区所有数据的时候,这种情况尤为常见。

我的解决方法是在程序内部使用一个栈区来解决这个问题,当每当socket缓冲区有数据的时候就将数据入栈,然后通过判断栈的长度或者栈中数据来判断是否完整接受了一次数据。如果栈中有了一个完整了发送方发送的数据(这个前提是双方协定好每次数据的固定长度)那么就将栈底的这些数据读取,然后重新排列一下栈区。

python描述

while True:
  ...
  ...
  receive=currentarmsocket.recv(1024)
  for i in receive:
    stack.append(i)
  if len(stack)<8:
    continue
  if len(stack)>10240:
    stack=list()
    break
  receive=stack[0:8]
  stack=stack[8:(len(stack)-8)]
  ...
  ...

上面这段代码能够很好地工作,然后保证到达地下的receive是一个完整的来自发送方发送的数据。

时间: 2025-01-09 20:39:59

TCP通信数据接收栈实现的相关文章

Java TCP异步数据接收

之前一直采用.Net编写服务端程序,最近需要切换到Linux平台下,于是尝试采用Java编写数据服务器.TCP异步连接在C#中很容易实现,网上也有很多可供参考的代码.但Java异步TCP的参考资料较少,网上例程多是阻塞多线程方法,由于线程的开销较大,当客户端较多时系统资源的消耗也较大. 综合网上和书本的相关知识,本文给出一个Java TCP异步接收数据的代码示例,并给出相关的注释. /** * TcpAsyncServer.java */ import java.nio.ByteBuffer;

ACE基本的TCP/IP Socket用法之TCP通信(接收什么就打印什么)1.0

客户端每隔8秒钟向服务端建立连接,发送内容之后关闭连接: 服务端不停的接受客户端的连接请求,收到内容之后就打印出来: 客户端从本地文件中读取内容发送给客户端: 客户端代码:client_main.cpp #include <iostream> #include <string> using namespace std; #include <fstream> #include <iterator> #include "ace/INET_Addr.h&

[网络篇]ESP8266-SDK教程(三)之TCP通信Server&lt;-&gt;Client

纳尼?昨天刚刚打印了个"Hello World!",今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了,所以咱就在基础篇和网络篇穿插着去学习一下ESP8266,毕竟兴趣才是最好的老师嘛!大家以后遇到问题了,来翻文章建议大家根据[XX篇]去快速定位该去哪一篇文章中去查找问题,当然具体会在哪一篇文章中有讲,也不一定了,后面也会穿插着写一点[项目篇][进阶篇][闲扯篇],总的来说就是,本系列文章并没有固定的路线,大家

TCP通信实现对接硬件发送与接收十六进制数据 &amp; int与byte的转换原理 &amp; java中正负数的表示

今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十六进制的字符串转换成字节数组 * * @param hexString * @return */ public static byte[] hexStrToByteArrs(String hexString) { if (StringUtils.isEmpty(hexString)) { retur

NetworkComms V3 使用TCP通信传递IList&lt;T&gt;类型的数据

客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用protobuf.net序列化器] 第一步创建相关的工程文件: MessageContract中的 User类为契约类,使用protobuf.net进行序列化 写法如下: using System; using System.Collections.Generic; using System.Text; usin

Sweet Snippet系列 之 TCP数据接收

Sweet Snippet系列 之 TCP数据接收 一.引子 虽说仍然是Sweet Snippet,不过本篇并没有代码,纯粹是自己觉得有点趣味,就索性一记了~ 二. 问题 接触过网络编程的朋友大概都应知道TCP,作为一种"流"式协议,TCP的粘包问题一直都是程序处理的要点,而这次的问题就是,如果发送n字节的TCP数据,对端接收时会出现多少种接收情况? 三. 解法 我们先从具体的一个实例来简单算一算吧~就假设我们发送了3个字节的TCP数据: 由于TCP如果接收成功至少可以接收一个字节,所

客户端通过TCP通信分页从服务器获取数据

本文主要探讨,客户端如何通过TCP通信,根据分页信息从服务器获取到相关数据 通常情况下,数据可能很多,比如几千或者几万条,并不适合一次性从服务器获取. 我们只从服务器获取当前页的数据 和数据库中记录总数以便我们可以在客户端计算出页数 ,当用户点击"上一页"或者"下一页"时,再获取相应页的数据 如下图: 双击上图中的某一项,再打开详细页面,如下图: 下面我们从头开始创建一个分页显示的Demo 通信框架采用来自英国开源的networkcomms2.3.1版本 数据库为s

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.

ACE_linux:TCP通信

1.涉及类 ACE_INET_Addr//ACE网络地址ACE_SOCK_Acceptor//ACE网络服务器ACE_SOCK_Connector//ACE网络客户端ACE_SOCK_Stream//ACE数据流 2.简介 TCP通讯 传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的.面向连接的运输服务,用于高可靠性数据的传输.TCP协议的可靠性是指保证每个tcp报文能按照发送顺序到达客户端. Tcp通信过程一般为如下步骤: a) 服务器绑定端口