I created a server that displays data sent from a client. It worked initially but stopped after I tried to include SSL authentication.
<code>import socket
import json
import ssl
HOST: str = '127.0.0.1'
PORT: int = 5507
def create_server_socket() -> socket.socket:
"""Creates a TCP socket, binds it to the host and port and listens for a connection. Will try again should the process fail"""
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f"SERVER LISTENING ON {HOST, PORT}")
return server_socket
except socket.error as message:
print("Socket creation error: " + str(message) + "n Retrying...")
return create_server_socket()
def main() -> None:
"""Main function to start the server."""
context : ssl.SSLContext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("ssl/server.crt", "ssl/server.key")
server_socket: socket.socket = create_server_socket()
context.wrap_socket(server_socket, server_side=True)
client_socket, client_address = server_socket.accept()
with client_socket:
data: bytes = client_socket.recv(1024)
print(f"{client_address} connected as {data.decode(encoding='utf-8')}n")
while True:
data: bytes = client_socket.recv(1024)
decoded_data: str = data.decode(encoding='utf-8')
try:
data: dict =json.loads(decoded_data)
except json.JSONDecodeError:
print(f"{client_address} disconnected!")
server_socket.close()
client_socket.close()
break
print(f"{data['sender']}: {data['msg']}")
if __name__ == '__main__':
main()
</code>
<code>import socket
import json
import ssl
HOST: str = '127.0.0.1'
PORT: int = 5507
def create_server_socket() -> socket.socket:
"""Creates a TCP socket, binds it to the host and port and listens for a connection. Will try again should the process fail"""
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f"SERVER LISTENING ON {HOST, PORT}")
return server_socket
except socket.error as message:
print("Socket creation error: " + str(message) + "n Retrying...")
return create_server_socket()
def main() -> None:
"""Main function to start the server."""
context : ssl.SSLContext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("ssl/server.crt", "ssl/server.key")
server_socket: socket.socket = create_server_socket()
context.wrap_socket(server_socket, server_side=True)
client_socket, client_address = server_socket.accept()
with client_socket:
data: bytes = client_socket.recv(1024)
print(f"{client_address} connected as {data.decode(encoding='utf-8')}n")
while True:
data: bytes = client_socket.recv(1024)
decoded_data: str = data.decode(encoding='utf-8')
try:
data: dict =json.loads(decoded_data)
except json.JSONDecodeError:
print(f"{client_address} disconnected!")
server_socket.close()
client_socket.close()
break
print(f"{data['sender']}: {data['msg']}")
if __name__ == '__main__':
main()
</code>
import socket
import json
import ssl
HOST: str = '127.0.0.1'
PORT: int = 5507
def create_server_socket() -> socket.socket:
"""Creates a TCP socket, binds it to the host and port and listens for a connection. Will try again should the process fail"""
try:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f"SERVER LISTENING ON {HOST, PORT}")
return server_socket
except socket.error as message:
print("Socket creation error: " + str(message) + "n Retrying...")
return create_server_socket()
def main() -> None:
"""Main function to start the server."""
context : ssl.SSLContext = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("ssl/server.crt", "ssl/server.key")
server_socket: socket.socket = create_server_socket()
context.wrap_socket(server_socket, server_side=True)
client_socket, client_address = server_socket.accept()
with client_socket:
data: bytes = client_socket.recv(1024)
print(f"{client_address} connected as {data.decode(encoding='utf-8')}n")
while True:
data: bytes = client_socket.recv(1024)
decoded_data: str = data.decode(encoding='utf-8')
try:
data: dict =json.loads(decoded_data)
except json.JSONDecodeError:
print(f"{client_address} disconnected!")
server_socket.close()
client_socket.close()
break
print(f"{data['sender']}: {data['msg']}")
if __name__ == '__main__':
main()
I received the following error:
OSError: [WinError 10038] An operation was attempted on something that is not a socket
What am I doing wrong and how do I fix it?