Recently I have had the need to make real-time communication from Roblox, to my own APIs, as of right now Roblox has no way to use things like websockets; because of this we have to use alternatives like Long Polling, which keeps connections alive to receive messages as soon as they occur.
The Defenition of Long Polling
Long polling is a technique where the server elects to hold a client’s connection open for as long as possible, delivering a response only after data becomes available or a timeout threshold has been reached.
Using it in Roblox
I have created an open-source Node, and Roblox module to accomplish this.
NPM Module: roblox-long-polling - npm
GitHub Module: https://github.com/ReAdminRBX/roblox-long-polling
Setting it all up
- Download our RobloxModule here
- Ensure HTTP Service is enabled as the steps below show
- Download the Roblox module by doing
npm i roblox-long-polling
- Add it to your Node.JS code with the example
const rlp = require("roblox-long-polling")
const poll = new rlp({
port: 2004, // Add this behind your IP, example: http://127.0.0.1:2004,
//password: "passsword here" If you want to add a simple password, put uncomment this and add your password
});
poll.on('connection', (connection) => {
console.log('New connection', connection.id);// Will fire when a new connection is active, and include this IP address.
poll.broadcast("new connection", connection.id); // Will broadcast to all active sockets that this one has joined the part.
connection.send('welcome', 'hello there!') // Will send a welcome message to the new socket.
connection.on('hello', (data) => {//On a event we will handle the hello message
console.log("received hello message!", data)
})
connection.on('internal_ping', () => {//We receive pings from the server to let us know its still alive, you cant disable this.
console.log("Keep-Alive Ping received")
})
connection.on('dsconnect', () => { // Fired when the game sends a disconnect command, or our timeout is fired.
console.log('Disconnection', connection.id)
poll.broadcast("disconnection", connection.id);
})
})
- Now, we’re going to install a script in ServerScriptService that requires the Module we imported earlier, this is our magic code that allows you to interface with the Node.JS API.
local robloxLongPolling = require(script.Parent.robloxLongPolling)
local connection = robloxLongPolling.Connect("http://72.24.217.22:2004", "")
connection:on("welcome", function(message)--This is an event fired in the above example, you can change this if you want into your own events.
print("received welcome ", message)
end)
connection:on("new connection", function(id)--This is an event fired in the above example, you can change this if you want into your own events.
print("new connection ", id)
end)
connection:on("disconnection", function(id)--Fired if we for some reason get disconnected.
print("disconnection ", id)
end)
connection:send("hello", "Hello world!")--Example on how to send messages.
wait(30)
connection:Disconnect()
Enabling HTTP Service
- Head on over to your game in Roblox Studio
- Open the top bar, and click “HOME”
- Click the cog named “Game Settings”
- In the modal that opens, click “Security”
- Ensure “Allow HTTP Requests” is enabled, if it isn’t, enable it.
Some Notes
Planning on releasing another version of this for scalable architecture, where a database/cache is used to keep connections open on multiple servers.
It’s open source, feel free to contribute!!!