Чтобы опция прослушивания порта работала, вы должны также использовать опции -n
или -p
.
Пример:
// test.groovy
println "Got $line from socket"
$ groovy -n -l8888 test.groovy &
groovy is listening on port 8888
$ echo hello | nc localhost 8888
Got hello from socket
$
EDIT:
Также обратите внимание, что вы получаете одну строку из сокета, а не полный HTTP-запрос. Так что в случае GET вы получите несколько строк для обработки каждого запроса, выглядя примерно так:
GET / HTTP/1.1
Host: localhost:8888
[a variable number of headers]
Весь запрос завершается пустой строкой. С POST это будет выглядеть примерно так:
POST / HTTP/1.1
Host: localhost:8888
[a variable number of headers]
d=test
Запрос такой же, за исключением того, что пустая строка, завершающая GET, представляет собой данные POST. К сожалению, данные POST не заканчиваются символом новой строки, и groovy использует ввод с буферизацией строки, так что он просто сидит и ждет новой строки.
Однако вы можете заставить его продолжить, закрыв конец гнезда. Попробуйте что-то вроде этого:
System.err.println(line) // log the incoming data to the console
if (line.size() == 0) {
println "HTTP/1.1 200 OK\r\n\r\nhello"
socket.shutdownOutput()
}
Затем groovy очистит буфер и завершит закрытие другого конца, и вы получите ваши данные POST.