end def create_server_socket socket = Socket.new(:INET, :STREAM, 0) #create socket sockaddr = Addrinfo.tcp("127.0.0.1", 2222) #create an address socket.bind(sockaddr) #bind socket to that address end
end def create_server_socket socket = Socket.new(:INET, :STREAM, 0) #create socket sockaddr = Addrinfo.tcp("127.0.0.1", 2222) #create an address socket.bind(sockaddr) #bind socket to that address socket.listen(5) #listen on the socket socket #return the socket end
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept # returns new socket end end
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept request = client_socket.recv(1056) end end
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept request = client_socket.recv(1056) response = run_application_code end end
{'Content-Type' => 'text/html'}, ["Hello world for reals"] ] end end Rack::Handler.register('server', 'Rack::Handler::Server') Rack::Handler::Server.run(RackApp.new) Ruby object Responds to .call with one arg Returns: status header body
{'Content-Type' => 'text/html'}, ["Hello world for reals"] ] end end Rack::Handler.register('server', 'Rack::Handler::Server') Rack::Handler::Server.run(RackApp.new) Ruby object Responds to .call with one arg Returns: status header body
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept handle_request(client_socket) client_socket.close end end def handle_request request = client_socket.recv(1056) response = run_application_code client_socket.print response end Extract out code that handles request
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept fork do handle_request(client_socket) end client_socket.close end end def handle_request request = client_socket.recv(1056) response = run_application_code client_socket.print response end Now we can fork the code that handles the request
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept fork do handle_request(client_socket) end client_socket.close end end def handle_request request = client_socket.recv(1056) response = run_application_code client_socket.print response end be sure to close this!
= create_server_socket loop_and_listen_for_client_requests(socket) end def loop_and_listen_for_client_requests(server) loop do client_socket, client_addrinfo = server.accept fork do handle_request(client_socket) end client_socket.close end end def handle_request request = client_socket.recv(1056) response = run_application_code client_socket.print response end
#context switch #buy a cat toy that #doesn’t exist :( buy_cat_toy else cat_toy_unavailable end end def purchase_cat_toys if @available_cat_toys > 0 #buy last cat toy buy_cat_toy else cat_toy_unavailable end end #context switch Thread 1 Thread 2
socket = create_server_socket loop_and_listen_for_client_requests(socket) socket.close end def trap_interrupt Signal.trap("INT") do puts "\nTerminating..." exit 130 end end