3

I have a code to start a simple socket sever on localhost. However, I want it to display a html page when it is accessed through browser. The html will contain two text fields and submit button. When user enters text in text fields and clicks on submit button, I want the program to read from text fields. How Can I Do That?

7
  • 1
    you can start simple HTTPServer/ baseHTTPServer using python Commented Sep 17, 2015 at 6:24
  • Yes, I Know But I am Want it to be a Socket Server. It's A requirement of my project Commented Sep 17, 2015 at 6:25
  • why wont look source code of BaseHTTPServer.py ? its using socket module Commented Sep 17, 2015 at 6:28
  • I am Afraid with my current knowledge of socket i will not be able to understand it Commented Sep 17, 2015 at 6:43
  • @TalhaAhmad Look at it anyway! It won't hurt. Commented Sep 17, 2015 at 7:19

1 Answer 1

5

The instant answer (I hope so) to your question is in the last section The Answer - and, if I have interpreted your question wrong, let me know in the comment section.


The confusion - You are confusing the fundamentals - to display a html page, you simply need a server (localhost in your case), and the browser will use the HTTP/HTTPS protocol to fetch that content/response/html page. In Python (almost same for other languages) there are two levels of access to network services:

  • Low-level via sockets.
  • Higher-level via application level network protocols, like HTTP, FTP, etc.

Sockets - in plain english it is a functionality (interface) provided by the machine's operating system to implement client and server (for the higher-level network protocols) like communication between the processes. These processes can be running on a same machine or both processes on physically apart machines (e.g. requesting a website using browser).

A typical socket client is (asking for the desired html from browser):

client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(("localhost", 80))

But to make it work you must already have server running (which will serve the html):

server_sock = socket.socket()     # Create a socket object
server_sock.bind((localhost, 80)) # Bind to the port
server_sock.listen(5) 
while True:
     # lines for whatever we want server to do  

The line server_sock.bind((localhost, 80)) has binded (assigned/allocated) the localhost:80 (a socket is basically 'host_name:port_number') to this server_sock i.e. any call/request to localhost:80 will be handled as per the lines in the above while True: block of the code above, can be a text response, HTML, etc.


Typical web scenario - We enter a website name www.google.com (which is resolved into an IP via DNS protocol - a whole another story) and hit enter, we'll get the Google's search homepage in response - Here you're the client, that is entering the website name and hitting enter is technically client_sock.connect('www.google.com', 80), and it only worked because on another (remote) machine/system/host they have server_socket binded and listening i.e.

server_sock.bind('machine's_IP', 80)
server_sock.listen(5)
while True:
    #accept connections from outside
    (client_socket, address) = server_socket.accept()

    # here will be the lines which send us back the Google's 
    # homepage html as a response to our web request.

To sum-up, servers (webserver in your case) can be implemented using (almost) any programming languages e.g. python or C, etc, but the basis, the lowest layer, exactly where the data is passed between 2 processes whether on the same machine using locahost (loopback) or each process running on physically apart machine/host (typical web scenario ) via the HTTP (TCP) protocol rest upon sockets. Sockets are the fundamental building block from which HTTP, HTTPS, FTP, SMTP protocols (all of these are TCP-type protocols) are defined.

DNS, DHCP, VOIP protocols are UDP protocols but they too are built on top of sockets.


The Answer - To start, create a web_server.py and paste the following code (only to see how it works) and run the file as script i.e. from the file's location run "python

web_server.py" in command prompt/terminal:

#!/usr/bin/env python
import socket

host = 'localhost'
port = 80
server_sock = socket.socket(socket.AF_INET,\
                            socket.SOCK_STREAM)    # Create a socket object
server_sock.bind((host , port))                    # Bind to the port

print 'Starting server on', host, port
print 'The Web server URL for this would be http://%s:%d/' % (host, port)

server_sock.listen(5)             # Now wait for client connection.

print 'Entering infinite loop; hit CTRL-C to exit'
while True:
    # Establish connection with client.    
    client_sock, (client_host, client_port) = socket.socket.accept()
    print 'Got connection from', client_host, client_port
    client_sock.recv(1000) # should receive request from client. (GET ....)
    client_sock.send('HTTP/1.0 200 OK\n')
    client_sock.send('Content-Type: text/html\n')
    client_sock.send('\n') # header and body should be separated by additional newline
    # you can paste your 2 text field html here in the <body>
    client_sock.send("""
        <html>
        <body>
        <h1>Hello World</h1> this is my server!
        </body>
        </html>
    """) 
    client_sock.close()

P.S. You have to implement a HTTP server (webserver) - which will definitely use the socket interface at the lowest level i.e.

server_sock.bind
server_sock.listen
server_sock.accept 
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks this was really helpful and i have send a html form to browser but how to get input from the form
i want the form to pass python the data of the form after user press submit button
I haven't tried it, but you can achieve it the usual way i.e. use the 'action' attribute in the <form> tag. The value of the 'action=formprocessor.py' can be a python script for processing the form data - place the formprocessor.py in the same directory where the server script/file is.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.