'Socket programming - Communication between server and client

I'm trying to learn about sockets and how to create a server and a client in python.

While reading this great article from Real Python I had difficulties understanding why the server receives two strings, when I only send one.

server.py

import socket

HOST = "127.0.0.1"
PORT = 65432

server = socket.socket(
    family=socket.AF_INET, 
    type=socket.SOCK_STREAM
)

with server:
    server.bind((HOST, PORT))
    server.listen()

    print("Waiting for connections...")
    conn, addr = server.accept()
    print("Accepted!")

    with conn:
        print(f"Connected by {addr}")
        while True:
            data = conn.recv(1024)
            print(f"Message received: {data}")
            if not data:
                print(f"Breaking while loop and closing connection")
                break
            conn.sendall(data)

client.py

import socket

HOST = "127.0.0.1"
PORT = 65432

client = socket.socket(
    family=socket.AF_INET, 
    type=socket.SOCK_STREAM
    )

with client as c:
    c.connect((HOST, PORT))
    # Get input from client
    message = input("Enter your message: ")
    c.sendall(str.encode(message))
    data = c.recv(1024)

print(f"Received {data}")

Output from server.py after running the server and client:

Waiting for connections...
Accepted!
Connected by ('127.0.0.1', 64476)
Message received: b'message'
Message received: b''
Breaking while loop and close connection

Why does the server receive two messages (b'message' and b'')



Solution 1:[1]

The recv() can only empty string when the other end is gone. You are unable to send zero length data over socket (try it :). So the fact you are seeing this is simply because you are not checking for that.

PS: your client's last print() is not correctly indented.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marcin Orlowski