我想创建一个到远程服务器的 TCP 连接socat
,其中客户端发送
- 对图像文件的操作(
"convert"
、"open"
等) - 图像(二进制内容)本身
然后服务器将使用给定的操作处理图像。
我的第一个想法是在二进制内容之前传递此文本操作类型:
# client
socat tcp:server:9999 -\
< <(echo "open"; cat path/to/imgfile)
# server
socat tcp-listen:9999 - | {
IFS= read -r action
cat - > /tmp/imgfile
# do process image file with action type ...
}
这似乎适用于特定情况,但不灵活,例如,当需要传递多个参数时。在二进制内容之前加上文本让我觉得,图像文件可能会被损坏?
因此,我试图找到一个更简洁的解决方案,一个一个地传递两个参数(这里称为双工通信):
到目前为止,我的尝试并不是以下方面的专家socat
:
# client
socat\
tcp:server:9999\
system:'echo "open"; IFS= read -r ack; cat path/to/image.png'
# server
socat tcp-listen:9999\
system:'IFS= read -r action; echo "ACK"; binary=$(cat -); echo "process image with action now..."'
目前让我
破管
这种类型的双工通信是否可能socat
(在最好的情况下不打开新端口)?
我是否监督了一个更简单的替代方案?
我可能应该说,这是以最简单/最普通的方式完成的,没有进一步使用框架,如果可能的话没有 HTTP 服务器开销。Shell 是 Bash,没有可用的 ZSH。也可以使用 Vanilla Python。
不; 但这与 . 无关
socat
。TCP 连接关闭,然后不能再使用。但是你的机制,特别cat -
是正如 Stéphane 指出的那样,依赖于关闭连接。所以,香草 Python。
从 包含模块的 Python 文档中,实际上只做了非常轻微的修改:
在客户端,
请注意,这绝对是普通的 python。
xmlrpc.server
标准 python 中包含的内容并不比 saysocket
或math
.我们可以从那里扩展香草概念;
venv
也是 Python 标准库的一部分。Soooo 如果你只有标准的 Python:给你更多的安慰。然后,您可以编写一个类似于快速入门示例的服务器:
保存
server.py
并运行为python3 -m flask --app server run --port 8000
.然后客户端在 shell 脚本中非常容易:
使用 Socat 的解决方案:
在您的尝试中发生的事情是:在第一次成功传输后,shell 写入文件内容并终止。Socat 将数据传输到服务器(并使用 TCP halfclose 发送 EOF)。服务器接收数据(和 EOF),并发送处理消息。客户端想要将处理消息写入 shell,但它已经终止,因此“Broken pipe”。
您想知道是否有 Socat 的解决方案。是的,有一个,有将近一百万个技巧……它通过了简单的测试,但可能会因实际需求而失败。
问题是 shell 必须发送 EOF 但仍然必须能够接收消息。我不知道让 shell 执行 halfclose 的方法,所以诀窍是使用两个 shell,它们使用管道在 Socat 外部传达 ACK 条件:
客户:
服务器:
解释:
"set +H" 允许使用 '!' 在庆典中;
管道首先由读者打开,因此它必须已经存在。
“-t 3600”以秒为单位设置半关闭超时,并且必须长于最长处理时间;
客户端打开两个shell,一个数据源仍然等待另一个shell传来的ACK,它在文件传输后终止;第二个 shell 从服务器获取所有数据,尤其是触发第一个 shell 的 ACK,最后将服务器输出传输到 stderr。