This article will tell you how to develop a client-server socket application using the Python socket module with examples. It will create both TCP and UDP protocol socket client and server.
1. How To Create TCP Client / Server Socket App In Python.
1.1 Create TCP Client Socket In Python Steps.
- Import the python socket module, this is a built-in module.
import socket
- Call the socket.socket(socket.AF_INET, socket.SOCK_STREAM) function to create the client socket, please note the function parameters.
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- Connect to the server socket by invoking the above client socket object’s client_socket.connect((‘localhost’, 8999)) function. The connect() function’s input parameter is a tuple object that contains the server socket machine hostname/IP and port number.
client_socket.connect(('localhost', 8999))
- Call the client socket object’s send() or sendall() function to send text data to the server socket. The function’s input parameter is a bytes object, so you need to encode the send text before sending it.
client_socket.sendall(user_input_str.encode('utf-8'))
- Call the client socket object’s client_socket.recv(1024) function to read the text that the server socket sends back.
data_tmp = client_socket.recv(1024)
- The received data is also a bytes object, you need to convert it to a text string by invoking the bytes object’s function decode(‘utf-8’).
str_tmp = data_tmp.decode('utf-8')
- Call the client socket’s close() function to close the socket connection.
client_socket.close()
1.2 Create TCP Server Socket In Python Steps.
- Import the python socket module.
import socket
- Create the server socket object by invoking the function socket.socket(socket.AF_INET, socket.SOCK_STREAM).
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- Bind the socket object to a host and a port number with the socket object’s bind( server_info_tuple_object ) function.
server_socket.bind(('localhost', 8080))
- Make the socket object be a server socket by invoking it’s listen(maximize_queue_size) function. The maximize_queue_size parameter is the number of the maximize socket connections that are waiting for the server socket to accept in the queue.
server_socket.listen(1)
- Call the server socket object’s accept() function to accept the client socket request, it will return a connection object and the client socket IP address.
(connection, client_ip) = server_socket.accept()
- Call the connection object’s recv(buffer_size) function to read the data sends from the client socket.
data = connection.recv(1024)
- The readout data is also a bytes type object, you need to invoke it’s decode(‘utf-8’) function to convert it to a string.
data_str = data.decode('utf-8')
- Call the connection object’s send(data) or sendall(data) function to send data back to the client socket.
connection.sendall('hello client, just received your data.'.encode('utf-8'))
- Call the connection object’s close() function to close the socket connection.
connection.close()
2. How To Create UDP Client / Server Socket App In Python.
2.1 Create UDP Client Socket In Python Steps.
- Import the python socket module, this is a built-in module.
import socket
- Call the socket.socket(socket.AF_INET, socket.SOCK_DGRAM) function to create the UDP client socket, please note the function parameters.
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- Call the UDP client socket object’s sendto(data, udp_server_socket_info_tuple) function to send data to the UDP server socket.
client_socket.sendto(user_input_str.encode('utf-8'), udp_server_tuple)
- The udp_server_info_tuple variable’s value is something like (‘127.0.0.1’, 8999) that contains the UDP server IP and port number.
- Call the UDP client socket object’s close() function to close the socket connection.
client_socket.close()
2.2 Create UDP Server Socket In Python Steps.
- Import the python socket module.
import socket
- Create the server socket object by invoking the function socket.socket(socket.AF_INET, socket.SOCK_STREAM).
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- Bind the socket object to a host and a port number with the socket object’s bind( server_info_tuple_object ) function.
server_socket.bind(('localhost', 8080))
- Call the server socket object’s recvfrom(buffer_size) function to receive the data sent from the client.
data, client_ip = server_socket.recvfrom(1024)
- The function recvfrom(buffer_size) returns the received data and the client IP address, the returned data is a bytes type object, you need to decode it to string using it’s decode(‘utf-8’) function.
data.decode('utf-8')
3. Create Client-Server TCP / UDP Socket Example.
- The above video is the example demo video.
- There are 2 python source files TCPSocketExample.py and UDPSocketExample.py in this example. The first file will demo the TCP socket, the second file will demo the UDP socket.
TCPSocketExample.py UDPSocketExample.py
- When you run this example in the command line console, it will prompt you to type character s or c. Type s means to create a server socket, type c means to create a client socket.
> python .\TCPSocketExample.py Input s to create server socket, input c to create client socket: > python .\UDPSocketExample.py Input s to create server socket, input c to create client socket:
- When you type s, you can get the below output on the console.
> python .\TCPSocketExample.py Input s to create server socket, input c to create client socket: s TCP server socket started and bind to host : localhost, port_number : 8999 > python .\UDPSocketExample.py Input s to create server socket, input c to create client socket: s UDP server socket started and bind to host : localhost, port_number : 8999
- When you input character c, then you can input the data that you want to send to the server socket.
> python .\TCPSocketExample.py Input s to create server socket, input c to create client socket: c Please input the text you want to sent to the TCP socket server: hello end <class 'socket.socket'> Data from server socket : hello client, just received your data.
- When you type & send the string ‘end‘ to the server socket, the server socket receives it and will close the socket connection.
- When the number of the client socket request is more than the maximum queue size you specified use the server_socket.listen(2) function ( for example start multiple client socket ), then the other client socket connects request will be rejected, you can see the below ConnectionRefusedError message.
t> python .\TCPSocketExample.py Input s to create server socket, input c to create client socket: c Traceback (most recent call last): File ".\TCPSocketExample.py", line 106, in <module> client_socket.connect(('localhost', 8999)) ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it.
- TCPSocketExample.py.
import socket import time # This function will create a TCP client socket. def create_tcp_client_socket(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) return client_socket # This function will create a TCP server socket that is bind on the bind_host and listen on the server_port_number port. def create_tcp_server_socket(bind_host, server_port_number): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((bind_host, server_port_number)) # set the server socket queue maximize connection size. # in the below configuration, if there are 2 socket connections in the queue are waiting for connecting, the server socket will reject other connections. server_socket.listen(2) print('TCP server socket started and bind to host : ' + bind_host + ', port_number : ' + str(server_port_number)) # initialize the connection variable to None. connection = None while True: if(connection == None): # accept the client connection and return the connection object and client ip. (connection, client_ip) = server_socket.accept() # get current time. current_time = time.localtime(time.time()) #print(current_time) current_time_str = str(current_time.tm_hour) + ':' + str(current_time.tm_min) + ':' + str(current_time.tm_sec) #print(current_time_str) #print(current_time_str + ' - The client socket address is ' + client_ip[0]) # receive the client socket sends text. data = connection.recv(1024) #print(type(connection)) #data = recv_data_by_socket_connection(connection, 1024) print(current_time_str + ' - receive data : ' + data.decode('utf-8') + ', from ip :' + client_ip[0]) # if client sends the string 'end', then close the current connection. if data.decode('utf-8') == 'end': # send text back to the client. connection.sendall('hello client, just received your data.'.encode('utf-8')) # close the socket connection. connection.close() # set the connection object to NULL. connection = None def recv_data_by_socket_connection(socket_conn, buffer_size): # receive text data from the socket server. recv_data_str = '' try: print(type(socket_conn)) data_tmp = socket_conn.recv(buffer_size) while True: str_tmp = data_tmp.decode('utf-8') if(len(str_tmp) ==0 ): break recv_data_str = recv_data_str + str_tmp data_tmp = socket_conn.recv(buffer_size) except Exception as e: print('Exception - ('+str(e)+') ') finally: return recv_data_str if __name__ == '__main__': # get user input from the command line. user_input_str = input("Input s to create server socket, input c to create client socket:\r\n") # if user input string 's'. if(user_input_str=='s'): # create the TCP server socket. create_tcp_server_socket('localhost', 8999) # if user input string 'c'. if(user_input_str=='c'): # create the client socket object. client_socket = create_tcp_client_socket() # connect to the server socket with provided host and port number. client_socket.connect(('localhost', 8999)) print("Please input the text you want to sent to the TCP socket server:\r\n") while True: # get user input string. user_input_str = input("") # send the user input to the server socket. client_socket.send(user_input_str.encode('utf-8')) client_socket.sendall(''.encode('utf-8')) # If user input the text 'end' then break the loop. if('end' == user_input_str): break # receive text data from the socket server. recv_data_str = recv_data_by_socket_connection(client_socket, 1024) '''recv_data_str = '' data_tmp = client_socket.recv(10) while True: if not data_tmp: break str_tmp = data_tmp.decode('utf-8') recv_data_str = recv_data_str + str_tmp data_tmp = client_socket.recv(10)''' # print out server returned data on client screen. print('Data from server socket : ' + recv_data_str) # close the connection. client_socket.close()
- UDPSocketExample.py
import socket import time # create and return a UDP client socket object. def create_udp_client_socket(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return client_socket # create the UDP server socket and listen for clinet to connect. def create_udp_server_socket(bind_host, server_port_number): # create the server side socket. server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # bind the server socket ip and listening port number. server_socket.bind((bind_host, server_port_number)) print('UDP server socket started and bind to host : ' + bind_host + ', port_number : ' + str(server_port_number)) # the main loop. while True: # receive data from the client socket. data, client_ip = server_socket.recvfrom(1024) current_time = time.localtime(time.time()) #print(current_time) current_time_str = str(current_time.tm_hour) + ':' + str(current_time.tm_min) + ':' + str(current_time.tm_sec) #print(current_time_str) # print the client send text on the screen. print(current_time_str + ' - receive data : ' + data.decode('utf-8') + ', from ip :' + client_ip[0]) if __name__ == '__main__': # get user input text. user_input_str = input("Input s to create server socket, input c to create client socket:\r\n") # if user input 's'. if(user_input_str=='s'): # create the UDP server socket. create_udp_server_socket('localhost', 8999) # if user input 'c'. if(user_input_str=='c'): # create the UDP client socket. client_socket = create_udp_client_socket() print("Please input the text you want to sent to the UDP socket server:\r\n") while True: # get user input. user_input_str = input("") # create a tuple object that contains the UDP server ip and port number. udp_server_tuple = ('127.0.0.1', 8999) # send data to the UDP server socket. client_socket.sendto(user_input_str.encode('utf-8'), udp_server_tuple) # if user input 'end' then exit the loop. if('end' == user_input_str): break # close the socket connection. client_socket.close()