如何确保通过java.net.socket的tcp传输成功?

4zcjmb1e  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(181)

为了从android应用程序支持标签打印,我使用原始tcp连接到支持zpl命令语言的工业标签打印机的9100端口。
似乎android和/或某些标签打印机的tcp/ip实现有一个怪癖,使得数据传输容易出错。。。
我首先遇到了godex zx420i打印机的问题,打印机的显示将表明它正在接收数据,但随后它将什么也不做,并无限期地挂起,直到我重新启动它。解决办法是 SO_SNDBUF 至1024通孔 Socket.setSendBufferSize() . 这在任何地方都没有记录,但我在godex的android sdk中找到了它(我在这篇博文中详细地描述了整个体验,最后提到了tcp问题。)
有趣的是如果我通过 ncat 在我的电脑里,我不需要做任何特别的事情。使我的应用程序将zpl命令发送到我的电脑(使用 ncat -l 9100 > test.zpl 将它们保存在一个文件中),然后从我的pc向打印机发送zpl命令(使用 ncat printer_ip 9100 < test.zpl )做得很好。只有android,也不是所有android设备都有这个问题。
(在我沮丧的时候,我甚至在我的电脑上用openjdk编写了相当的java代码,而且效果也不错。)
现在我有一个非常类似的问题,与TSCME240打印机。将zpl命令从我的android应用程序发送到pc,将它们保存在一个文件中,然后将它们发送到打印机,效果很好。但是当android应用程序直接连接到打印机并发送完全相同的命令时,打印机什么也不做。
以下是我在应用程序中使用的java代码:

// 'address' was set to 'new InetSocketAddress(ipAddress, 9100)'
// 'output' refers to a ByteArrayOutputStream

try (Socket socket = new Socket()) {
    socket.setSendBufferSize(1024);
    socket.setSoTimeout(5000);
    socket.connect(address);
    output.writeTo(socket.getOutputStream());
}

如果您能为打印机提供任何可能导致损坏行为的帮助,我们将不胜感激。godex zx420i的工作非常好,因为我添加了 socket.setSendBufferSize(1024) 线(虽然这是一个谜,为什么它是必要的),但TSCME240没有做什么。
考虑到ms-windows的tcp/ip实现,或者其他一些 ncat 无论是什么,似乎都能可靠地与任何打印机型号配合使用。

更新

我现在觉得自己很愚蠢,因为在这种情况下,问题毕竟出在我发送的zpl命令中。我超过了“打印位图”命令(^gf)允许的最大大小。我做的测试,我把命令发送到我的电脑,然后到打印机是一个较小的标签。
然而,我把这个问题留着讨论,并认为它没有解决,因为我仍然不明白为什么有必要设置 SO_SNDBUF 为一些打印机工作正常1024,并希望了解这一点(在这种情况下,这是肯定的,而不是位图大小或任何其他;我从android和我的pc上发送了完全相同的字节。这次我只是因为之前的经历而下结论。)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题