import socket
HOST, PORT = '', 8888
def handle_request(request: bytes) -> bytes:
request_data = request.decode()
http_response = f"""HTTP/1.1 200 OK\nContent-Type: text/html\n\n{request_data}"""
return http_response.encode()
def serve_forever():
# Устанавливаем TCP-соединение
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listen_socket:
listen_socket.bind((HOST, PORT))
listen_socket.listen()
print('Serving HTTP on port {port} ...'.format(port=PORT))
while True:
client_connection, client_address = listen_socket.accept()
with client_connection:
request = client_connection.recv(1024) # Получаем информацию от клиента
http_response = handle_request(request)
client_connection.sendall(http_response)
if __name__ == '__main__':
serve_forever()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listen_socket:
listen_socket.bind((HOST, PORT))
listen_socket.listen()
while True:
client_connection, client_address = listen_socket.accept()
with client_connection:
request = client_connection.recv(1024) # Получаем информацию от клиента
http_response = handle_request(client_connection)
client_connection.sendall(http_response)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as listen_socket:
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
listen_socket.bind((HOST, PORT))
listen_socket.listen()
listen_socket.setblocking(False)
read_sockets, write_sockets, error_sockets = select.select(read_file_descr, write_file_descr, exception_file_descr, timeout)
import logging
import selectors
import socket
import sys
HOST, PORT = '', 8000 # Порт сервера
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
def new_connection(selector: selectors.BaseSelector, sock: socket.socket):
new_conn, address = sock.accept()
logger.info('accepted new_conn from %s', address)
new_conn.setblocking(False)
selector.register(new_conn, selectors.EVENT_READ, read_callback)
def read_callback(selector: selectors.BaseSelector, sock: socket.socket):
data = sock.recv(1024)
if data:
sock.send(data)
else:
logger.info('closing connection %s', sock)
selector.unregister(sock)
sock.close()
def run_iteration(selector: selectors.BaseSelector):
events = selector.select()
for key, mask in events:
callback = key.data
callback(selector, key.fileobj)
def serve_forever():
"""
Метод запускает сервер на постоянное прослушивание новых сообщений
"""
with selectors.SelectSelector() as selector:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind((HOST, PORT))
server_socket.listen()
server_socket.setblocking(False)
logger.info('Server started on port %s', PORT)
selector.register(server_socket, selectors.EVENT_READ, new_connection)
while True:
run_iteration(selector)
if __name__ == '__main__':
serve_forever()
selector.register(server_socket, selectors.EVENT_READ, new_connection)
def run_iteration(selector: selectors.BaseSelector):
events = selector.select()
for key, mask in events:
callback = key.data
callback(selector, key.fileobj)
python echo_server.py
telnet 127.0.0.1 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.