Câu trả lời:
Sử dụng nc
( netcat
).
Người phục vụ:
$ nc -l localhost 3000
Khách hàng:
$ nc localhost 3000
Cả máy chủ và máy khách sẽ đọc và ghi vào đầu ra / đầu vào tiêu chuẩn.
Điều này sẽ hoạt động khi cả máy chủ và máy khách trên cùng một máy. Nếu không thì đổi localhost
sang tên bên ngoài của máy chủ.
Thú vị hơn một chút, một "máy chủ" cung cấp cho bạn thời gian trong ngày nếu bạn kết nối với nó và gửi nó d
, và nó sẽ thoát nếu bạn gửi q
:
Máy chủ (trong 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"
Phiên khách hàng:
$ nc localhost 3000 d Ngày 12 tháng 1 18:04:21 CET 2017 Xin chào? Gì? q
(máy chủ thoát ra sau q
, nhưng máy khách không phát hiện ra rằng nó đã biến mất cho đến khi bạn nhấn Enter).
Nói chung lời khuyên với netcat
là cách tốt hơn.
Nhưng trong bash
và ksh
bạn cũng có thể làm điều này:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
1>&3
gì Tôi không chắc điều đó thể hiện điều gì
echo "request" >&3
, tôi đoán rằng 1 chỉ là dư thừa
thử netcat (ví dụ: 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
) đến máy chủ http cục bộ của mìnhTrong nhiều trường hợp tôi không có quyền truy cập vào netcat / socat. Tôi cũng gặp vấn đề với việc sử dụng bash's exec
trong môi trường điện toán phân tán.
Do mức độ phổ biến của nó, một giải pháp thay thế là sử dụng các khả năng TCP / IP của GNU AWK. Nó cung cấp một cú pháp đơn giản dựa trên toán tử "đường ống hai chiều".
Dưới đây là một ví dụ được sửa đổi từ nguồn này sẽ gửi tin nhắn TCP qua ổ cắm:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
Cú pháp đầy đủ cho địa chỉ là : /net-type/protocol/local-port/remote-host/remote-port
. Khi local-port
được đặt thành 0, máy chủ cục bộ sẽ chọn cổng tự động, thường là thứ bạn muốn. Bạn có thể đọc thêm về gawk
's TCP / IP khả năng kết nối mạng ở đây:
ctrl+c
sẽ không hiển thị kết quả. Nếu sử dụng echo, ví dụecho "cookie" | nc localhost 9090
, luồng đầu ra của máy khách sẽ bị đóng (đã gửi eof) nhưng máy khách vẫn sẽ đợi kết quả của máy chủ.