Ответы:
Использование nc
( netcat
).
Сервер:
$ nc -l localhost 3000
Клиент:
$ nc localhost 3000
И сервер, и клиент будут читать и записывать в стандартный вывод / ввод.
Это будет работать, когда сервер и клиент находятся на одном компьютере. В противном случае измените localhost
на внешнее имя сервера.
Немного интереснее, «сервер», который дает вам время суток, если вы подключитесь к нему и отправите ему 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 localhost 3000 d Чт 12 января 18:04:21 CET 2017 Здравствуйте? Какая? 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. У меня также были проблемы с использованием Bash exec
в распределенной вычислительной среде.
Из-за его распространенности альтернативным решением является использование возможностей TCP / IP GNU AWK. Он предоставляет простой синтаксис, основанный на его операторе «двусторонний канал».
Вот модифицированный пример из этого источника , который отправит 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 "cookie" | nc localhost 9090
, при использовании echo выходной поток клиента будет закрыт (eof sent), но клиент все равно будет ожидать результата сервера.