As a hobby / to learn I am building an app in JavaScript using Node.js where a component of it will take input from a client, send it to a server, and then broadcast it to other clients. For simplicity let's say that the data looks like: {"x_pos":0.4, "y_pos":0.2}, and specifies an avatar's (x,y) position on a map in a game. I want each user to have an avatar, and each avatar's (x,y) position shared.

Currently I am using Websocket (socket.io) to do this. I figured Websocket would be ideal because it is TCP, and will include an identifier of who each user is. However, the fact that communication is bidirectional seems to be sub-optimal. Additionally, I am emitting position data from all clients 30 times a second to the server, which then broadcasts it to all users. This works well for one user, but I do not know how it would scale.

However, I have also heard that UDP is ideal for games, but I understand that UDP is connectionless and doesn't track user connections etc. So then would this mean that I would not be able to keep track of who incoming (x,y) data belongs to? (I suppose I could change the data to be something like {"user":"id", "x_pos":0.4, "y_pos":0.2} and handle updates on the Client side that way). There is also WebRTC, that uses UDP, but peer to peer connections I doubt would scale well.

So I am curious what people think is the best protocol here. Am I on the right track by using Websocket to broadcast player position? Or should I be using something else?

I would like to note I am not building a commercial app in any way, and I anticipate the load to be no more than 6 people at once for this. But 6 people * 30 emits a second to the server + 6 * 30 emits to all clients means 360 socket.io emit() events a second, which seems maybe not what socket.io was built for here? That said, I hear that Websocket establish a data stream, where UDP does not, so maybe that means that UDP may be more overhead? I honestly do not know and cannot find this information readily online.

  • 1
    UPD is essentially a "fire and forget" transport mechanism for messages that fit in a single packet. UDP does not guarantee delivery or even delivery in the same order as messages were sent. How well can your game deal with those characteristics? Jan 8, 2021 at 7:41
  • I think it can handle losing out a on a few packets since it's conveying absolute position and there's a decent amount of smoothing. With a normal internet connection, would UDP fail more on the order of milliseconds (e.g. 1 or 2 packets are lost a second) or seconds (e.g. 30+ packets are lost a second)? Jan 8, 2021 at 21:31
  • The packet loss with UDP is the same as the retransmission rate of a TCP connection (which you notice in an increased latency). A bigger problem might be the out-of-order delivery. Jan 9, 2021 at 8:23


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.