- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个更大的缓冲区,我正在尝试将其作为数据包发送。 Nodejs 将缓冲区分割成更小的(65k 数据包)。一旦客户端收到它们,我如何确保数据包组合在一起并有效地将它们重新组合到缓冲区中?
几乎用这个作为测试:
// tcp socket
var buf = Buffer.alloc(265000);
socket.write(buf);
然后在客户端,我需要以某种方式将 65k 数据包组合回缓冲区。
谢谢
最佳答案
TCP 可以自由地将线路上的数据分解成任意大小的数据包。根据不同的实现或物理传输,大小可以不同。您无法确切知道这将如何发生,也不应该具体取决于它是如何实现的。它甚至可能会根据您的数据采用的路径而有所不同。
此外,.on('data', ...)
事件只是为您提供到目前为止已到达的所有数据。虽然数据包的顺序得到保证,但不能保证如果您写入一组特定的字节,它们都会在同一个 data
事件中到达。它们可以被分解成更小的碎片,并且可能以更小的碎片形式到达。当 TCP 之上没有真正的协议(protocol)时,这就是 TCP 较低级别上发生的情况。
因此,如果您通过 TCP 发送大量数据,则必须发明自己的协议(protocol)才能知道何时获得整组数据。有多种不同的方案可以实现此目的。
分隔符。某种分隔符,不会出现在实际数据中,表示一组数据的结束。您读取并解析数据,直到获得分隔符,然后您就知道您拥有可以处理的完整数据集。 HTTP 协议(protocol)使用换行符作为分隔符。有时使用零字节作为分隔符。
先发送长度。对于二进制数据,通常先发送数据的长度,然后接收者知道他们正在读取多少字节的数据,直到获得完整的数据集.
现有协议(protocol)。像 webSocket 协议(protocol)这样的协议(protocol)可以让您发送任意大小的消息,它会自动将它们包装成包含长度信息的数据包,以便可以自动为您重新组合它们到原始数据集,而无需您自己执行此操作。还有数千种其他协议(protocol),其中一种可能非常适合您的需求,您只需使用现有的实现即可,而无需编写自己的实现。
如果您有某种机制知道何时收到一组完整的数据,那么您可以设置 data
事件处理程序来读取数据,将其收集到缓冲区中并观察结束数据(使用您选择的任何机制)。当您看到一组末尾时,您可以将其与可能在其之后到达的任何其他数据分开,然后对其进行处理。
因此,假设您使用零字节作为分隔符,并且您已确保零不能也不会出现在实际数据中。然后,您将设置一个数据
处理程序,如下所示:
let accumulatedData = Buffer.alloc(0);
socket.on('data', data => {
// check for delimiter character
let offset = data.indexOf(0);
if (offset !== -1) {
// get the whole message into one Buffer
let msg = Buffer.concat(accumulatedData, data.slice(0, offset));
// put rest of data into the accumulatedData buffer as part of next piece of data
// skip past the delimiter
accumulatedData = data.slice(offset + 1);
// emit that we now have a whole msg
socket.emit('_msg', msg);
} else {
// no delimiter yet, just accumulate the data
accumulatedData = Buffer.concat(accumulatedData, data);
}
});
// if any accumulated data still here at end of socket
// notify about it
// this is optional as it may be a partial piece of data (no delimiter)
socket.on('end', () => {
if (accumulatedData.length) {
socket.emit('_msg', accumulatedData);
}
});
// this is my own event which is emitted when a whole message is available
// for processing
socket.on('_msg', msg => {
// code here to process whole msg
});
注意:此实现删除了消息末尾的分隔符
关于node.js - 如何有效地发送大数据包/合并较小的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010158/
使用 Python 的 rtmplib 绑定(bind)并遇到一些问题。 首先, 我有这样的东西: import librtmp conn = librtmp.RTMP(...) conn.con
基本上,我是在查看 Motorstorm 排行榜时在 PS3 上窃听数据包。排行榜以 XML 格式发送到我的 ps3,但只有在我获得授权后。那么有人可以告诉我这三个数据包之间发生了什么,以及我如何在浏
我正在努力了解 TCP,但解析大量 RFC 并没有帮助。我相信我了解连接和关闭握手,但我似乎无法找到任何总结实际数据流的内容。 在连接和关闭握手之间 TCP 数据包看起来像什么? (特别是标题) 最佳
我正在尝试通过 RCON 端口与我的 Minecraft 服务器通信。 虽然我不知道如何使用套接字和流的东西。四处寻找,我发现他们都有一些共同点。套接字、输入流和输出流。 我在我的代码中试过了,但返回
我正在 UDP 之上设计一个简单的协议(protocol),现在我意识到其他人可以将数据包发送到我正在监听的端口。这样的数据包对于我的应用程序来说显然是不正确的(我现在不担心安全问题) 是否有过滤这些
我目前有一个具有可自定义滴答率的游戏服务器,但在本示例中,我们建议服务器每秒仅滴答一次或 1hz。我想知道如果客户端发送速率比服务器快,因为我当前的设置似乎不起作用,那么处理传入数据包的最佳方法是什么
我无法理解网络字节顺序以及通过 UDP 发送和接收数据的顺序。我正在使用 C#。 我有一个结构保持: message.start_id = 0x7777CCCC; message.me
我正在为 USB 设备编写代码。假设 USB 主机开始控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的 wLength)是端点 0 最大数据包大小的倍数。那么在主机接收到所有数据后(
我有一台 Windows PC、Marvell 交换机、Netgear 交换机和一台 Ubuntu 机器连接在一起(通过 Netgear 交换机)。 我最近从 Windows PC 向 Marvell
在查看数据包字节码时,您将如何识别 dns 数据包。 IP header 的协议(protocol)字段会告诉后面有一个 UDP 帧,但是在 UDP 帧内没有协议(protocol)字段来指定接下来会
我有一个通过 udf 的 802.11 (wifi) 上各种类型的流量的 pcap。由于 MTU,udp(或更准确地说是 IP)对 wifi 数据包进行分段。我目前正在使用 SharpPcap 读取并
我正在开发的 Core Audio 应用程序上有此崩溃日志。我目前正在调试它,所以我的问题不是关于崩溃本身,而是关于 的含义“k”包 . 这是什么意思 ? 我已阅读 this , 和 this (关于
我在一台 VM Ubuntu 16.04 机器上的 100 个多播组上生成 UDP 数据包,并在另一台 VM Ubuntu 16.04 机器上订阅这些组。两者都在由 Hyper-V 管理器运行的 HP
这个问题在这里已经有了答案: How can I fix 'android.os.NetworkOnMainThreadException'? (66 个回答) 6年前关闭。 我正在尝试创建一个简单的
我正在寻找使用 Java 来欺骗 UDP 数据包。是否有任何好的 Java 库可以让您创建自己的 RAW SOCKETS? 最佳答案 我会使用包装 libpcap 的 Java API . libpc
我在基于 Tyrus 的客户端和 tomcat Web 服务器之间使用没有压缩的 websocket。我在 tomcat 端看到消息传入和传出我的套接字,但如果我设置一个wireshark来观察它们传
我的应用程序在模拟器中运行时无法接收 UDP 数据包。 UDP 数据包由“localhost”上的以下 java 程序通过端口 49999 发送。 DatagramSocket clien
我正在开发一个 Google Glass 应用程序,它需要在工作线程中监听 UDP 数据包(与发送 UDP 数据包的现有系统集成)。我之前发布了一个问题(请参阅 here )并收到了一个答案,其中提供
我正在从客户端向服务器发送两个数据包。我遇到的问题是,在服务器上读取的数据使两个字符串对于发送的最长字符串具有相同的长度。例如: 如果字符串 1 为:1234 字符串 2 为:abcdefghi 服务
我知道这是不好的做法,但是可以执行以下操作吗? Send packet1 to UDP port 1 port 1 receives packet1 and sends it to port 2 po
我是一名优秀的程序员,十分优秀!