#sockets #r
#сокеты #r
Вопрос:
[Отказ от ответственности: мои знания о сокетах очень устарели, и я только начинаю изучать R, поэтому, если я пропустил что-то совершенно очевидное, пожалуйста, укажите на это!]
Если я понимаю (скудно документированные) функции R для создания сокетов и управления ими, а именно socketConnection
и make.socket
, то получается, что при создании серверного сокета ( server=TRUE
) выполняется моральный эквивалент следующего:
s = socket(yada yada);
listen(s, ...);
s2 = accept(s, ...);
close(s, ...);
и теперь я могу работать с s2
, но не могу выполнить цикл, чтобы справиться с накопившимися входящими подключениями к s
. Это более или менее правильно? Есть ли какой-либо способ продолжить прослушивание и продолжить обработку дополнительных входящих подключений после обработки первого?
Комментарии:
1. Вы когда-нибудь с этим разобрались?
Ответ №1:
Я бы тоже хотел знать ответ на этот вопрос! …но в то же время я могу, по крайней мере, предложить обходной путь с некоторыми ограничениями:
Если вы можете знать, СКОЛЬКО клиентов подключится, то должно сработать следующее.
На сервере:
n=2 # Number of clients
port=22131
slist=vector('list',n)
# Connect to all clients
for(i in 1:n) slist[i] <- socketConnection('localhost', port=port, server=TRUE)
# Wait for a client to send data, returns the client index
repeat {
avail <- which( socketSelect(slist) )[[1]]
# ...then read and process data, rinse, repeat...
}
На каждом клиенте:
port=22131
# Connect to server
s <- socketConnection('localhost', port=port)
# ...then send data...
writeLines(c('foo', 'bar'), s)
Комментарии:
1. Спасибо за идею! К сожалению, я не знаю заранее, сколько клиентов может подключаться одновременно, хотя я могу адаптировать ваш код для повторного подключения в «пуле сокетов», который может поддерживать до N клиентов одновременно.
Ответ №2:
Нет, вы можете нажать кнопку обратного входа s1
.
Окно 1:
$ R
s1 = socketConnection(server=T,port=12345)
s2 = socketConnection(server=T, port=98765)
Окно 2:
$ nc localhost 12345
If ever I should leave you, it wouldn't be in springtime
Knowing how in spring I'm bewitched by you so
oh no not in springtime, summer, winter, or fall
no never could I leave you at all
Окно 3:
$ nc localhost 98765
for Hitler and Germany
Deutschland is happy and gay
we're marching to a faster pace
look out, here comes the Master Race!
Окно 1:
readLines(s1,1)
# "if ever I should leave you, it wouldn't be in springtime"
readLines(s2,1)
# "for Hitler and Germany"
readLines(s1,1)
# "knowing how in spring I'm bewitched by you so"
Комментарии:
1. обратная связь… вы хотите сказать, что это неправильно? Или просто не нравится мой вкус в музыкальном театре?
2. Позвольте мне рассказать вам, почему отрицательный ответ: «Гитлер и Германия».. Почему вы не можете изменить это на что-то более приятное?
3. Для всех, кто продолжает отмечать это, пожалуйста, обратите внимание, что выше приведены тексты из «Springtime for Hitler» от «The Producers» /
4. Независимо от происхождения этого текста, он одобряет жестокий расизм и в любом случае абсолютно не нужен для ответа на вопрос.