Simple HTTP Server and Client in Python

This time I'd like to show you how to make a simple HTTP server and client in python. It's a bit different from other tutorials I've ever wrote and I'd like to say that I'm also a beginner in python. But, I'll try to make sure you understand what I wrote because this tutorial is easy.
First, you need to know what HTTP is. Definition of HTTP based on  wikipedia:
The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborative, hypermedia information systems. HTTP is the foundation of data communication for the World Wide Web.

In simple words, HTTP is a protocol that used for world wide web communication. So, if you're browsing the web, downloading data, and hosting a website, you're using HTTP protocol. There are many web server software that support HTTP protocol such as  apachenginx, and  lighttpd. This time, you're so lucky because I'll show you how to make something like that (a simple version of course) in python language.
Step #1: Write HTTP server script using BaseHTTPServer module

Luckily, python provide us an HTTP server module, it's called  BaseHTTPServer. We use two classes from this module, namely  BaseHTTPRequestHandler  and  HTTPServer. We also need to use  os module to access file in your system.
First, we need to import those modules 
#!/usr/bin/env python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os

Next, write a custom class namely  KodeFunHTTPRequestHandler   that implement BaseHTTPRequestHandler
#Create custom HTTPRequestHandler class
class KodeFunHTTPRequestHandler(BaseHTTPRequestHandler):

In this tutorial, I just implement GET command from HTTP. To do that, we need to override  do_GET()  function. Our objective is to request an HTML file from server using our client (explained int the next step). Script inside do_GET()   function is written to handle our objective.
#handle GET command
    def do_GET(self):
        rootdir = 'c:/xampp/htdocs/' #file location
        try:
            if self.path.endswith('.html'):
                f = open(rootdir + self.path) #open requested file

                #send code 200 response
                self.send_response(200)

                #send header first
                self.send_header('Content-type','text-html')
                self.end_headers()

                #send file content to client
                self.wfile.write(f.read())
                f.close()
                return
            
        except IOError:
            self.send_error(404, 'file not found')


Finally, add following script to run the server
def run():
    print('http server is starting...')

    #ip and port of servr
    #by default http server port is 80
    server_address = ('127.0.0.1', 80)
    httpd = HTTPServer(server_address, KodeFunHTTPRequestHandler)
    print('http server is running...')
    httpd.serve_forever()
    
if __name__ == '__main__':
    run()

Save it and name it whatever you want (e.g,  kodefun-httpserver.py ). Here is the complete script of http server:
#!/usr/bin/env python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os

#Create custom HTTPRequestHandler class
class KodeFunHTTPRequestHandler(BaseHTTPRequestHandler):
    
    #handle GET command
    def do_GET(self):
        rootdir = 'c:/xampp/htdocs/' #file location
        try:
            if self.path.endswith('.html'):
                f = open(rootdir + self.path) #open requested file

                #send code 200 response
                self.send_response(200)

                #send header first
                self.send_header('Content-type','text-html')
                self.end_headers()

                #send file content to client
                self.wfile.write(f.read())
                f.close()
                return
            
        except IOError:
            self.send_error(404, 'file not found')
    
def run():
    print('http server is starting...')

    #ip and port of servr
    #by default http server port is 80
    server_address = ('127.0.0.1', 80)
    httpd = HTTPServer(server_address, KodeFunHTTPRequestHandler)
    print('http server is running...')
    httpd.serve_forever()
    
if __name__ == '__main__':
    run()

Step #2: Write a simple HTTP client

To check if our server is working fine, we need an HTTP client. You can use your web browser to do this. But, It'll be cool if you make your own client. To accomplish this, let's make another script, let's name it  kodefun-httpclient.py. Copy following script to your file:
#!/usr/bin/env python

import httplib
import sys

#get http server ip
http_server = sys.argv[1]
#create a connection
conn = httplib.HTTPConnection(http_server)

while 1:
    cmd = raw_input('input command (ex. GET index.html): ')
    cmd = cmd.split()

    if cmd[0] == 'exit': #tipe exit to end it
        break
    
    #request command to server
    conn.request(cmd[0], cmd[1])

    #get response from server
    rsp = conn.getresponse()
    
    #print server response and data
    print(rsp.status, rsp.reason)
    data_received = rsp.read()
    print(data_received)
    
conn.close()

Step #3: Test using GET command

The final step, we'll test is our scripts above work just fine. To run the server, type the following command in your command prompt or terminal:
python kodefun-httpserver.py

If there is no problem, you'll see "http server is running...". Next, we need to create a dummy HTML file, let's call it dummy.html and copy the code below:
<head>
 <title>Dummy HTML</title>
</head>
<body>
 <h1>Kode Fun is Awesome</h1>
 <h1>You're awesome</h1>
</body>


Save it to your root folder defined in your script. In this example I use  c:/xampp/htdocs/ .
Next, we need to run the client, type following command to run the client:
python kodefun-httpclient.py 127.0.0.1


When the client is running type following code to get dummy.html file:
GET dummy.html


If there is no problem, and it should be no problem, you'll see the content of dummy.html file.

That's all I can do this time. My upcoming tutorial is how to perform face detection using Accord.NET. Stay tune and keep fighting!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值