消息传递需要在更高的层次上实现;TCP没有消息的概念-TCP连接传输八位字节流。
你可以实现的东西排序像你要求什么nc
和命名管道,请参阅man mkfifo
; 或socat
按照Alex Stragies的指示进行检查。
没有中间层服务,基本问题是:(1)除非另一端有人在监听数据,否则无法将数据写入网络;(2)TCP连接是双向的。
因为除非有人正在侦听,否则您无法将数据写入网络,因此必须始终启动侦听器,然后才能发送数据。(在消息传递系统中,处理消息的过程将提供某种缓冲。)
您的示例可以轻松地重写:
首先在machine2(目标)上启动一个侦听器:
nc -l 1234 | ...some processing with the received data...
在您的示例中,这将是
nc -l 1234 | cat
这将阻止并等待某人将某些数据发送到端口1234。
然后,您可以从machine1(源)发送一些数据:
...make up some data... | nc machine2 1234
在您的示例中,这将是
echo "Hello" | nc machine2 1234
如果要以某种方式处理接收到的数据并做出响应,则可以使用Shell的协同处理工具。例如,这是一个非常简单(也很固执)的Web服务器:
#! /bin/bash
while :; do
coproc ncfd { nc -l 1234; }
while :; do
read line <&${ncfd[0]} || break
line="$(
echo "$line" |
LC_ALL=C tr -cd ' -~'
)"
echo >&2 "Received: \"$line\""
if [ "$line" = "" ]; then
echo >&${ncfd[1]} "HTTP/1.0 200 OK"
echo >&${ncfd[1]} "Content-Type: text/html"
echo >&${ncfd[1]} "Connection: close"
echo >&${ncfd[1]} ""
echo >&${ncfd[1]} "<title>It works!</title>"
echo >&${ncfd[1]} "<center><b>It works!</b></center>"
echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
break
fi
done
kill %%
sleep 0.1
done
了解如何使用数组中的文件描述符在脚本主体和协同进程之间实现双向通信$ncfd
。