【问题标题】:android, netcat: how to send more than 2048 Byte over UDPandroid,netcat:如何通过 UDP 发送超过 2048 字节
【发布时间】:2014-06-12 16:30:56
【问题描述】:

我正在尝试通过 UDP 实现从笔记本 (Linux) 到 Android 设备的数据传输。

在我启动的笔记本上:

cat /home/me/my/file.txt | nc -u 192.168.150.3 12345

或者:

nc -u 192.168.150.3 12345 < /home/me/my/file.txt

得到相同的结果。

在 Android 设备上,我的代码是:

byte[] msg = new byte[100000];

DatagramPacket p = new DatagramPacket(msg, msg.length);
DatagramSocket s = new DatagramSocket(portNumber);
s.receive(p);

message = new String(msg, 0, p.getLength());

s.close();

如果我在“message =”行设置断点,我可以看到 msg.length = 100000。没错。但是 p.getLength() 只有 2048。这意味着我只传输了一部分数据。我的意思是“消息”不包含“file.txt”中的所有数据。为什么会这样?我做错了什么?

【问题讨论】:

    标签: java android udp transfer netcat


    【解决方案1】:

    nc 不会在单个 UDP 数据包中发送整个文件,因此不要期望在单个调用中接收它。您必须多次调用receive 直到一切都完成。当然,使用 UDP 你不会得到“连接结束”,所以你必须有一些其他的指标来表明你得到了所有的数据。而且,使用 UDP 数据包可以静默丢失或重新排序,因此无法保证您以您想要的方式获取文件。

    【讨论】:

    • 非常感谢!这也是我的怀疑。你可能知道 netcat 在通过 udp 发送文件后等待什么?
    • @user3137385:netcat 只是等待来自对等方的数据。而且由于 UDP 中没有文件结束或连接关闭,它会等到你杀死它。
    • 我想写一个脚本,它必须每秒通过 udp 发送一个文件。有没有可能自动终止等待?
    • @user3137385:查看手册页或用法,选项 -q。而且,就像我已经说过的那样,UDP 不保证所有数据包的有序传递或任何传递,因此接收到的文件可能已损坏。
    • @user3137385 它也不能保证你不会多次收到一个数据包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多