Сокет-сервак работает параллельно с твоим клиентом, пишущим MOTD и ждущим ответа. Клиентские данные могли не успеть обработаться серваком во второй раз, могли проинтерпретироваться в виде сдублированной строки "MOTDMOTD", а могли и вовсе быть поглощены ZOGом во имя вселенского благополучия. Ты же делаешь :read() в слепой надежде на успех. Непорядок! Подписывайся на ивент internet_ready, делай небольшую задержку между отправкой запросов на MOTD, разбивай сообщения через символ переноса строки, правильно обрабатывай их на сервере, а затем уже читай данные:
local soc = require("internet")
local event = require("event")
event.listen("internet_ready", function()
local motd = soc:read(100)
...
end)
soc.open("localhost", 2888)
soc:write("MOTD\r\n")
os.sleep(1)
soc:write("MOTD\r\n")
os.sleep(1)
...
Либо, если оч сложна, юзай костыль со слипом. Но тут тоже никаких гарантий, то данные пришли и обработались корректно:
local soc = require("internet")
soc.open("localhost", 2888)
soc:write("MOTD")
os.sleep(1)
motd = soc:read(100)
soc:write("MOTD")
os.sleep(1)
motd = soc:read(100)
...