【问题标题】:Java UDP Server-Client communication - sending fragments (fragment sending failed)Java UDP Server-Client通信-发送分片(分片发送失败)
【发布时间】:2016-10-28 16:51:22
【问题描述】:

我正在本地主机上测试我的程序,当我想从客户端发送到服务器文件时,例如 jpg,我想在我的 548.fragment 之后用我的标题将数据拆分为 100 字节片段,像这样出错。服务器打印接收到的内容。

RECEIVED: 43749 | 1 | 546 | 1176 | jpg
RECEIVED: 60251 | 1 | 547 | 1176 | jpg
RECEIVED: 53346 | 1 | 548 | 1176 | jpg
RECEIVED: 55018 | 1 | 737 | 1176 | jpg

第一个是校验和第二个消息数第三个片段数第四个最大片段和最后一个文件类型。到目前为止,一切都在正确地发送更小的文件。请问有什么问题吗?

【问题讨论】:

    标签: java udp


    【解决方案1】:

    我假设您指的是消息的“无效”顺序(737 在 548 之后)?

    这其实是完全正常的,因为UDP不保证消息(数据报)的顺序:

    未排序 – 如果将两条消息发送给同一收件人,则 它们到达的顺序无法预测。

    只需改用 TCP,或实施应用程序级算法来缓冲和重组您的数据。

    另外,请注意 UDP RFC (https://www.rfc-editor.org/rfc/rfc768) 所说的:

    协议是面向事务的,交付和复制 不保证保护。 需要有序可靠的应用 数据流的交付应该使用 传输控制协议 (TCP)

    即您还可能会遇到丢失或重复的数据报(尽管这种情况比较少见,除非您有一些网络问题)

    【讨论】:

    • 实际上,它可以,规范没有说明任何关于“本地主机”的额外保证,因此取决于您的操作系统网络堆栈的实现,以及您正在运行的机器类型(例如多核或多 CPU),您仍然可能会导致数据报乱序。见stackoverflow.com/questions/2533873/… 甚至松散其中一些stackoverflow.com/questions/3034680/…
    • 请注意,这并不一定意味着您的问题出在网络堆栈中,也可能是应用程序级编程错误,没有足够的详细信息可以肯定地说。但问题是,无论如何,您不能依赖 UDP 数据报以特定顺序传送,或者根本不传送。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2017-01-25
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多