Python networking 101

gmelodie

Gabriel Cruz (he/him)

Posted on August 10, 2020

Python networking 101

This is how I survive in web development using mainly Python.

Getting a web page, posting data to an API or making connections to FTP servers to download files automatically are super common tasks when you're programming. And, as with most tasks, Python makes it super easy to do them.

HTTP Requests

For the HTTP stuff, all you want is in the requests library. Wanna get the best website ever?

import requests

response = requests.get('https://gmcruz.me')
response.content # gives the HTML for the page
response.status_code  # gives the HTTP status code (200, 404, etc.)
Enter fullscreen mode Exit fullscreen mode

Boom

How about sending data in a POST request to an API?

import requests

endpoint = 'https://httpbin.org/post'
body = {'user':'gabriel', 'password':'iloveyou'}

response = requests.post(endpoint, data = body)
response.json() # converts the response object to JSON
Enter fullscreen mode Exit fullscreen mode

Done

Sockets and connections

What are Sockets?
Sockets are pretty much like electricity sockets. There's one on the wall with holes in it (the server-site, or listening socket) that waits for other sockets to plug in it (the client-side socket).

What are Ports?
TCP sockets are bind to TCP ports. A port is just an integer that addresses a program (or rather, a process). This allows a host to have multiple processes using TCP sockets to run at the same time. When a packet comes in, it reads the port and sends the incoming data to the appropriate program.

If you come from a C background, the Python functions for socket handling pretty much mimic the C ones, but with that extra sugar that we all love.

To create a listening TCP socket on localhost port 9849

import socket

host = 'localhost'   # or any other host
port = 9849          # or any other port

my_socket = socket.socket() # create a new socket object
my_socket.bind((host, port)) # bind the socket to host and port
my_socket.listen() # start listening

conn, addr = my_socket.accept() # accept an incoming connection
Enter fullscreen mode Exit fullscreen mode

To connect to the listening TCP socket at localhost port 9849

import socket

host = 'localhost'   # or any other host
port = 9849          # or any other port

my_socket = socket.socket()
my_socket.connect((host, port))
Enter fullscreen mode Exit fullscreen mode

To send data through the connected socket

conn.send('hey there'.encode()) # on the server (listening) side
Enter fullscreen mode Exit fullscreen mode

Or

my_socket.send('hey there'.encode()) # on the client side
Enter fullscreen mode Exit fullscreen mode

Sockets speak in a different encoding than utf-8 (which Python uses). Don't forget to always .encode() your data from utf-8 to bytes before sending.

Finally, to receive data from a socket

max_bytes_to_recv = 1024
data = my_socket.recv(max_bytes_to_recv)
print(data.decode())
Enter fullscreen mode Exit fullscreen mode

Similarly to encoding, don't forget to .decode() your data from bytes to utf-8 after receiving.

💖 💪 🙅 🚩
gmelodie
Gabriel Cruz (he/him)

Posted on August 10, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Python networking 101
python Python networking 101

August 10, 2020