Best Python supported server/client protocol?
I'm looking for a good server/client protocol supported in Python for making data requests/file transfers between one server and many clients. Security is also an issue - so secure login would be a plus. I've been looking into XML-RPC, but it looks to be a pretty old (and possibly unused these days?) protocol.
Asked by: Lily378 | Posted: 28-01-2022
If you are looking to do file transfers, XMLRPC is likely a bad choice. It will require that you encode all of your data as XML (and load it into memory).
"Data requests" and "file transfers" sounds a lot like plain old HTTP to me, but your statement of the problem doesn't make your requirements clear. What kind of information needs to be encoded in the request? Would a URL like "http://yourserver.example.com/service/request?color=yellow&flavor=banana" be good enough?
There are lots of HTTP clients and servers in Python, none of which are especially great, but all of which I'm sure will get the job done for basic file transfers. You can do security the "normal" web way, which is to use HTTPS and passwords, which will probably be sufficient.
If you want two-way communication then HTTP falls down, and a protocol like Twisted's perspective broker (PB) or asynchronous messaging protocol (AMP) might suit you better. These protocols are certainly well-supported by Twisted.Answered by: Julian421 | Posted: 01-03-2022
ProtocolBuffers was released by Google as a way of serializing data in a very compact efficient way. They have support for C++, Java and Python. I haven't used it yet, but looking at the source, there seem to be RPC clients and servers for each language.
I personally have used XML-RPC on several projects, and it always did exactly what I was hoping for. I was usually going between C++, Java and Python. I use libxmlrpc in Python often because it's easy to memorize and type interactively, but it is actually much slower than the alternative pyxmlrpc.
PyAMF is mostly for RPC with Flash clients, but it's a compact RPC format worth looking at too.
When you have Python on both ends, I don't believe anything beats Pyro (Python Remote Objects.) Pyro even has a "name server" that lets services announce their availability to a network. Clients use the name server to find the services it needs no matter where they're active at a particular moment. This gives you free redundancy, and the ability to move services from one machine to another without any downtime.
For security, I'd tunnel over SSH, or use TLS or SSL at the connection level. Of course, all these options are essentially the same, they just have various difficulties of setup.Answered by: Rebecca299 | Posted: 01-03-2022
Pyro (Python Remote Objects) is fairly clever if all your server/clients are going to be in Python. I use XMPP alot though since I'm communicating with hosts that are not always Python. XMPP lends itself to being extended fairly easily too.
There is an excellent XMPP library for python called PyXMPP which is reasonably up to date and has no dependancy on Twisted.Answered by: Paul524 | Posted: 01-03-2022
I suggest you look at 1. XMLRPC 2. JSONRPC 3. SOAP 4. REST/ATOM XMLRPC is a valid choice. Don't worry it is too old. That is not a problem. It is so simple that little needed changing since original specification. The pro is that in every programming langauge I know there is a library for a client to be written in. Certainly for python. I made it work with mod_python and had no problem at all. The big problem with it is its verbosity. For simple values there is a lot of XML overhead. You can gzip it of cause, but then you loose some debugging ability with the tools like Fiddler.
Third candidate would be REST/ATOM. REST is a principle, and ATOM is how you convey bulk of data when it needs to for POST, PUT requests and GET responses. For a very nice implementation of it, look at GData, Google's API. Real real nice.
SOAP is old, and lots lots of libraries / langauges support it. IT is heeavy and complicated, but if your primary clients are .NET or Java, it might be worth the bother. Visual Studio would import your WSDL file and create a wrapper and to C# programmer it would look like local assembly indeed.
The nice thing about all this, is that if you architect your solution right, existing libraries for Python would allow you support more then one with almost no overhead. XMLRPC and JSONRPC are especially good match.
Regarding authentication. XMLRPC and JSONRPC don't bother defining one. It is independent thing from the serialization. So you can implement Basic Authentication, Digest Authentication or your own with any of those. I have seen couple of examples of client side Digest Authentication for python, but am yet to see the server based one. If you use Apache, you might not need one, using mod_auth_digest Apache module instead. This depens on the nature of your application
Transport security. It is obvously SSL (HTTPS). I can't currently remember how XMLRPC deals with, but with JSONRPC implementation that I have it is trivial - you merely change http to https in your URLs to JSONRPC and it shall be going over SSL enabled transport.Answered by: Sarah471 | Posted: 01-03-2022
HTTP seems to suit your requirements and is very well supported in Python.
Twisted is good for serious asynchronous network programming in Python, but it has a steep learning curve, so it might be worth using something simpler unless you know your system will need to handle a lot of concurrency.
To start, I would suggest using
urllib for the client and a WSGI service behind Apache for the server. Apache can be set up to deal with HTTPS fairly simply.
SSH can be a good choice for file transfer and remote control, especially if you are concerned with secure login. Most Linux and Solaris servers will already run an SSH service for administration, so if your Python program use ssh then you don't need to open up any additional ports or services on remote machines.
OpenSSH is the standard and portable SSH client and server, and can be used via subprocesses from Python. If you want more flexibility Twisted includes Twisted Conch which is a SSH client and server implementation which provides flexible programmable control of an SSH stack, on both Linux and Windows. I use both in production.Answered by: Emily734 | Posted: 01-03-2022
I'd use http and start with understanding what the Python library offers.
Then I'd move onto the more industrial strength Twisted library.Answered by: Elise697 | Posted: 01-03-2022
There is no need to use HTTP (indeed, HTTP is not good for RPC in general in some respects), and no need to use a standards-based protocol if you're talking about a python client talking to a python server.
Use a Python-specific RPC library such as Pyro, or what Twisted provides (Twisted.spread).Answered by: Ada705 | Posted: 01-03-2022
XMLRPC is very simple to get started with, and at my previous job, we used it extensively for intra-node communication in a distributed system. As long as you keep track of the fact that the None value can't be easily transferred, it's dead easy to work with, and included in Python's standard library.
Run it over https and add a username/password parameter to all calls, and you'll have simple security in place. Not sure about how easy it is to verify server certificate in Python, though.
However, if you are transferring large amounts of data, the coding into XML might become a bottleneck, so using a REST-inspired architecture over https may be as good as xmlrpclib.Answered by: Arthur623 | Posted: 01-03-2022
Facebook's thrift project may be a good answer. It uses a light-weight protocol to pass object around and allows you to use any language you wish. It may fall-down on security though as I believe there is none.Answered by: Blake814 | Posted: 01-03-2022
In the RPC field, Json-RPC will bring a big performance improvement over xml-rpc: http://json-rpc.org/wiki/python-json-rpcAnswered by: Victoria541 | Posted: 01-03-2022
python - How to implement a two way jsonrpc + twisted server/client
Hello I am working on develop a rpc server based on twisted to serve several microcontrollers which make rpc call to twisted jsonrpc server. But the application also required that server send information to each micro at any time, so the question is how could be a good practice to prevent that the response from a remote jsonrpc call from a micro be confused with a server jsonrpc request which is made for a user. T...
Scala equivalent of python echo server/client example?
All the "server" example in scala use actors, reactors etc... Can someone show me how to write a dead simple echo server and client, just like the following python example of Server and Client: # A simple echo server import socket ...
sockets - python tcp server/client in 1 program
I am trying to create a server/client TCP python program for an assignment at school. I am not good in programming at all and I am running into some problems. With the below code I can start the server, connect to it with the same file and port but then the server crashes instantly. I have no idea what is wrong.. The complete assignment by the way is the following: Create a python TCP server/client in 1 fi...
debian - Very simple python-dbus server/client in same process
I'm playing with DBus and python. I have created a very simple DBus client and corresponding server. It works perfectly when each runs on its own python process. However, I'm trying to get it to work in the same process, but it only works 10% of the times I run the code. The rest of time, it simply freezes. I've simplified the code as much as possible, and the problem persists. The code is below: ...
python - Twisted Conch - Server/Client
I'm looking to create a Twisted Conch Server/Client SSH application similar to the below: Client <---Key1---> Server/Client <---Key2---> Server I guess it's like an SSH MITM or command proxier. I have read the answers to similar Twisted related questions, such as: Twisted ser...
networking - Server/Client Connection (Python)
This is my code for server : import socket serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "192.168.1.3" port = 8000 print (host) print (port) serversocket.bind((host, port)) serversocket.listen(5) print ('server started and listening') while 1: (clientsocket, address) = serversocket.accept() print ("connection found!") data = clientsocket.recv(1024).decode() print...
Raspberry PI Server/Client Socket in Python
I am trying to set up a Python socket between my Raspberry Pi (running Raspbian) and my Macbook Pro (running Mavericks). Both devices are connected to the same WiFi network in my appt. I run the server code on my RPi and then the client code on my Macbook (I have also tried the reverse). I think that I am missing a set up step because the code I am using I found on multiple sites, so I assume it works. I also ch...
python - Do I need to package a MySQL server/client with my pyinstaller app?
I built an application using pyside and sqlalchemy. I package this application with Pyinstaller. It works great with the sqlite database engine, but I am starting to deploy it now and want to do so with the mysql engine. Do I need to package a Mysql server/client with the application? And if so can I do so with Pysinstaller?
sockets - Python: using a simple chat server/client for 2 player game
I've written a python chess game that I'd like to make playable by two people on two different computers. Without using external libraries, my first thought was to try to adapt code for a simple chat server/client to allow the game to communicate moves to both users. From my research, it seems the following code is pretty standard: # client from socket import * PORT = 8000 s = socket(AF_INET, SOCK_STREAM) ...
Python socket server/client not looping
I'm working on a number guessing game handled over two clients connected via socket, but for some reason after the initial loop it stops working and doesn't send/receive anything. The code all executes fine the first time around, but no matter what I change, the second time around I either get an error at the line guessNumber = int(s.recv(4096).decode() in the server file - where it reports an error trying to ...
Still can't find your answer? Check out these communities...
PySlackers | Full Stack Python | NHS Python | Pythonist Cafe | Hacker Earth | Discord Python