This recipe is similar to the previous one, except this one is with UDP. The method recvfrom() reads the messages from the socket and returns the data and the client address.
Listing 1.14a shows how to write a simple UDP echo client/server application as follows:
#!/usr/bin/env python
# Python Network Programming Cookbook,
Second Edition -- Chapter - 1
# This program is optimized for Python 2.7.12
and Python 3.5.2.
# It may run on any other version with/without
modifications.
import socket
import sys
import argparse
host = 'localhost'
data_payload = 2048
def echo_server(port):
""" A simple echo server """
# Create a UDP socket
sock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
# Bind the socket to the port
server_address = (host, port)
print ("Starting up echo server
on %s port %s" % server_address)
sock.bind(server_address)
while True:
print ("Waiting to receive message
from client")
data, address = sock.
recvfrom(data_payload)
print ("received %s bytes
from %s" % (len(data), address))
print ("Data: %s" %data)
if data:
sent = sock.sendto(data, address)
print ("sent %s bytes back
to %s" % (sent, address))
if __name__ == '__main__':
parser = argparse.ArgumentParser
(description='Socket Server Example')
parser.add_argument('--port', action="store", dest="port", type=int, required=True)
given_args = parser.parse_args()
port = given_args.port
echo_server(port)
On the client side code, we create a client socket using the port argument and connect to the server, as we did in the previous recipe. Then, the client sends the message, Test message. This will be echoed, and the client immediately receives the message back in a few segments.
Listing 1-14b shows the echo client as follows:
#!/usr/bin/env python
# Python Network Programming Cookbook, Second Edition -- Chapter - 1
# This program is optimized for Python 2.7.12 and Python 3.5.2.
# It may run on any other version with/without modifications.
import socket
import sys
import argparse
host = 'localhost'
data_payload = 2048
def echo_client(port):
""" A simple echo client """
# Create a UDP socket
sock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
server_address = (host, port)
print ("Connecting to %s port %s" % server_address)
message = 'This is the message. It will be
repeated.'
try:
# Send data
message = "Test message. This will be
echoed"
print ("Sending %s" % message)
sent = sock.sendto(message.encode
('utf-8'), server_address)
# Receive response
data, server = sock.recvfrom(data_payload)
print ("received %s" % data)
finally:
print ("Closing connection to the server")
sock.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser
(description='Socket Server Example')
parser.add_argument('--port', action="store", dest="port", type=int, required=True)
given_args = parser.parse_args()
port = given_args.port
echo_client(port)