When developing client / server applications, it's often useful to be able to test each side on its own. It's even more useful when one of the two sides doesn't provide any log capability.
This article provides very simple test servers, aimed at helping client development.
Our first server is a multithreaded TCP server, written in Python. Code is copied from here. It is only (very very) slightly modified, to ensure that it receives incoming connection requests on any local network interface.
Received data is echoed back to the client.
Beware: TCP is a stream-oriented protocol, not a message-oriented protocol. So the code below would not be acceptable in a production environment. Anyway, for test purposes, there is no real problem
from socket import * import thread BUFF = 1024 HOST = '' #HOST = '127.0.0.1'# must be input parameter @TODO PORT = 7714 # must be input parameter @TODO def response(key): return 'Server response: ' + key def handler(clientsock,addr): while 1: data = clientsock.recv(BUFF) if not data: break print repr(addr) + ' recv:' + repr(data) clientsock.send(response(data)) print repr(addr) + ' sent:' + repr(response(data)) if "close" == data.rstrip(): break # type 'close' on client console to close connection from the server side clientsock.close() print addr, "- closed connection" #log on console if __name__=='__main__': ADDR = (HOST, PORT) serversock = socket(AF_INET, SOCK_STREAM) serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) serversock.bind(ADDR) serversock.listen(5) while 1: print 'waiting for connection... listening on port', PORT clientsock, addr = serversock.accept() print '...connected from:', addr thread.start_new_thread(handler, (clientsock, addr))
Our second server implements a very simple web service returning information in JSON format, again in Python. Code is adapted from this one. Starting from a fresh Linux Mint 17.3 virtual machine, here is what I did to run this server:
virtualenv flask flask/bin/pip install flask
#!flask/bin/python from flask import Flask, jsonify, abort, make_response app = Flask(__name__) users = [ { 'id': 1, 'name': 'Rocky', 'age': 38 }, { 'id': 2, 'name': 'Steve', 'age': 50 }, { 'id': 3, 'name': 'Melinda', 'age': 38 } ] @app.route('/users', methods=['GET']) def get_users(): return jsonify({'users': users}) @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = [user for user in users if user['id'] == user_id] if len(user) == 0: abort(404) return jsonify({'user': user[0]}) @app.errorhandler(404) def not_found(error): return make_response(jsonify({'error': 'Not found'}), 404) if __name__ == '__main__': app.run(debug=True)
chmod u+x app.py ./app.py
I had to develop a system where a client application had to send messages to a remote server application, on a predefined port (20000), and wait for answers received on a predefined local port (20001). All messages were sent over UDP. On Linux, socat allows to set up an echo test server in a very simple way:
socat -v UDP4-RECVFROM:20000,fork UDP4-SENDTO:<clienthost>:20001
The -v option displays received messages.
socat - TCP-LISTEN:<port>,crlf
For on of the projects I'm working on, I need to receive binary files sent by a POST requests. Here is a simple Python program that does this.