Answers:
使用nc
(netcat
)。
服务器:
$ nc -l localhost 3000
客户:
$ nc localhost 3000
服务器和客户端都将读取和写入标准输出/输入。
当服务器和客户端都在同一台计算机上时,这将起作用。否则,更改localhost
为服务器的外部名称。
稍微有趣一点的是,一个“服务器”为您提供一天中的时间(如果您连接到该服务器并向其发送a)d
,而在您发送时退出q
:
服务器(在中bash
):
#!/bin/bash
coproc nc -l localhost 3000
while read -r cmd; do
case $cmd in
d) date ;;
q) break ;;
*) echo 'What?'
esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"
kill "$COPROC_PID"
客户会话:
$ nc本地主机3000 d 欧洲中部时间2017年1月12日18:04:21 你好? 什么? q
(服务器会在之后退出q
,但在您按之前,客户端不会检测到服务器已消失Enter)。
一般建议用netcat
是更好的方法。
但是在中bash
,ksh
您还可以执行以下操作:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
1>&3
?我不确定这代表什么
echo "request" >&3
,我想1就是多余的了
尝试netcat(例如nc)
echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
echo GET / HTTP/1.0
)发送到本地http服务器在许多情况下,我无法访问netcat / socat。我exec
在分布式计算环境中使用bash也遇到了问题。
由于其流行,一种替代解决方案是使用GNU AWK的TCP / IP功能。它基于“双向管道”运算符提供了一种简单的语法。
这是此源的修改示例,它将通过套接字发送TCP消息:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
地址的完整语法为:/net-type/protocol/local-port/remote-host/remote-port
。当local-port
设置为0时,本地主机会自动选择端口(通常是您想要的端口)。您可以在此处阅读有关gawk
的TCP / IP网络功能的更多信息:
ctrl+c
则不会显示结果。如果使用echo,例如echo "cookie" | nc localhost 9090
,客户端的输出流将被关闭(发送),但客户端仍将等待服务器的结果。