Respostas:
Usando nc
( netcat
).
Servidor:
$ nc -l localhost 3000
Cliente:
$ nc localhost 3000
O servidor e o cliente lerão e gravarão na saída / entrada padrão.
Isso funcionará quando o servidor e o cliente estiverem na mesma máquina. Caso contrário, mude localhost
para o nome externo do servidor.
Um pouco mais interessante, um "servidor" que fornece a hora do dia se você se conectar a ele e enviar um d
e que encerra se você enviar q
:
Servidor (pol 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"
Sessão do cliente:
$ nc localhost 3000 d Quinta-feira, 12 de janeiro de 18:04:21 CET 2017 Olá? O que? q
(o servidor sai depois q
, mas o cliente não detecta que se foi até você pressionar Enter).
Em geral, o conselho netcat
é o melhor caminho.
Mas no bash
e ksh
você também pode fazer isso:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
1>&3
? Não estou certo o que isso representa
echo "request" >&3
, acho que o 1 é apenas redundante
tente netcat (por exemplo, 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
) ao meu servidor http localEm muitos casos, eu não tive acesso ao netcat / socat. Também tive problemas com o uso do bash exec
em um ambiente de computação distribuído.
Devido à sua prevalência, uma solução alternativa é usar os recursos TCP / IP do GNU AWK. Ele fornece uma sintaxe simples, baseada no operador "pipe bidirecional".
Aqui está um exemplo modificado desta fonte que enviará uma mensagem TCP através de um soquete:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
A sintaxe completa para o endereço é: /net-type/protocol/local-port/remote-host/remote-port
. Quando local-port
está definido como 0, o host local escolhe a porta automaticamente, o que normalmente é o que você deseja. Você pode ler mais sobre gawk
os recursos de rede TCP / IP aqui:
ctrl+c
ele não mostrará o resultado. Se estiver usando eco, por exemploecho "cookie" | nc localhost 9090
, o fluxo de saída do cliente será fechado (enviado automaticamente), mas o cliente continuará aguardando o resultado do servidor.