I’m newer to Defold and Lua but completed the “War battles tutorial” and feel pretty good about how things worked.
While trying to get an echo from the example at API reference (extension-websocket) (defold.com)
I ran into some issues. It looks like the echo.websocket.org server may no longer be available and I’m getting this error when using log
ERROR:SCRIPT: /main/websocket_code.script:10: attempt to call global 'log' (a nil value)
stack traceback:
/main/websocket_code.script:10: in function </main/websocket_code.script:1>
Does log require a separate dependency?
Now onto the main question.
Does the WebSocket extension support using secure websockets?
Can you run a WebSocket server from Defold? Or rather is there a higher level API that allows creation of a websocket server without implementing the protocol yourself?
After doing some research I think the answer to both of the above may be no. After reading this post and an earlier one before signing up to the forum.
My intended use case is to run an instance of Defold as a WebSocket server per game match.
Where is this coming from? Is the websocket_code.script your own? There is no built in log function, but you may have picked that up from some example? To print/log something you usually only do
print("Hello!")
Yes
We only provide a WebSocket client, but there’s nothing stopping you from implementing a server as well.
The websocket_code.script contains code I pasted from the API reference.
local function websocket_callback(self, conn, data)
if data.event == websocket.EVENT_DISCONNECTED then
log("Disconnected: " .. tostring(conn))
self.connection = nil
update_gui(self)
elseif data.event == websocket.EVENT_CONNECTED then
update_gui(self)
log("Connected: " .. tostring(conn))
elseif data.event == websocket.EVENT_ERROR then
log("Error: '" .. data.message .. "'")
elseif data.event == websocket.EVENT_MESSAGE then
log("Receiving: '" .. tostring(data.message) .. "'")
end
end
function init(self)
print("This is firing")
self.url = "ws://echo.websocket.org"
local params = {
timeout = 3000,
headers = "Sec-WebSocket-Protocol: chat\r\nOrigin: mydomain.com\r\n"
}
self.connection = websocket.connect(self.url, params, websocket_callback)
end
function finalize(self)
if self.connection ~= nil then
websocket.disconnect(self.connection)
end
end
I will spend more time learning Lua and Defold on my own though.
Maybe somebody could answer or point me in the right direction on the starting point for implementing a websocket server?
Would a websocket server be something I could implement on my own in the Defold editor with Lua or would that require getting into the lower level nuts and bolts of the engine or extension?
I guess I’m thinking that to create a websocket_server I would need to implement it on top of an existing TCP server? Are there existing facilities in Defold to run a TCP server? Or would I be starting from UDP?
Or is binding a TCP socket to a port enough to begin listening in Defold?
Oh, I see. Sorry about that. Just replace log() with print(). I’ve updated the docs:
It should be up on the website in a minute or two.
I don’t know exactly how a WebSocket server works, but if it’s anything like a TCP server or standard webserver for http requests then it will indeed require quite a bit of work. You need to manage multiple connected clients and probably also some logic around the handshake/connect process. It will require work similar to what you find in the WebSocket extension:
I just want to note that the C library that we use (Wslay) supports both client/server.
It’s just that we haven’t implemented the server part in our extension, but that shouldn’t be too hard for someone used to C/C++. As a reference, one can look at the implementation of websockets in Godot (using the same library).
Thanks for the info, it seems like this is where I should start. And I imagine would end up being worth it in the end as opposed to trying to build some ad hoc state and collision manager on some existing service.
I will need to look into the bob the builder command tool. I was more talking about how it was probably developed with “plain” sockets. It would be nice if browsers could use UDP, or well nicer for me.
GameLift only helps you spin up a server. The capabilities of that server is for you to decide But yes, if you want your server to support HTML5 clients then that’s totally doable as long as you chose a network protocol that a web client can handle (such as WebSockets).
Ok, that makes sense. I think my plan is to start with the wslay library by itself to try and wrap my head around it and then explore the Defold native extension example and go from there. Thanks for the info.