I have written an application in Python 2.7 and I'm using UDP sockets to implement networking capabilities. Though my application is not a game, I would consider it a game for networking purposes because the screen is redrawn 60 times per second.
I do not need extreme precision, so I don't need to send a ton of packets per second, but the way I have implemented networking causes fellow users to look "choppy" if there aren't a fair amount of packets sent per second.
After some research and fiddling, I've decided to send one packet every 50 milliseconds. This makes the other users look fairly "smooth" for a while, but after about a minute they get more and more choppy, eventually to the point of no updates happening.
How am I supposed to implement networking like the networking done in video games? It seems like I am fundamentally missing something.
It looks to me that the network is getting congested, transmitting old packets that got into the routers' queues and dropping the new packets.
Programming UDP is something of a black art — it requires reacting to network congestion when needed, and slowing down your sending rate.  A simple solution would be to have the receiver send a periodic summary of received packets (say, once per RTT), and reduce your sending rate when you're seeing too many losses.  Ideally, you'd combine that with a precise RTT estimator and reduce your sending rate preemptively when the RTT suddenly increases.
How often should UDP packets be sent?