python网络请求_Python实现HTTP GET请求

TCP socket

在互联网上,我们可以让某台计算机作为服务器。服务器开放自己的端口,被动等待其他计算机连接。当其他计算机作为客户,主动使用socket连接到服务器的时候,服务器就开始为客户提供服务。

在Python中,我们使用标准库中的socket包来进行底层的socket编程。

首先是服务器端,我们使用bind()方法来赋予socket以固定的地址和端口,并使用listen()方法来被动的监听该端口。当有客户尝试用connect()方法连接的时候,服务器使用accept()接受连接,从而建立一个连接的socket:

# Written by Windy

# Server side

import socket

# Address

HOST = ''

PORT = 8000

reply = 'Yes'

# Configure socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((HOST, PORT))

# passively wait, 3: maximum number of connections in the queue

s.listen(3)

# accept and establish connection

conn, addr = s.accept()

# receive message

request = conn.recv(1024)

print 'request is: ',request

print 'Connected by', addr

# send message

conn.sendall(reply)

# close connection

conn.close()

socket.socket()创建一个socket对象,并说明socket使用的是IPv4(AF_INET,IP version 4)和TCP协议(SOCK_STREAM)。

然后用另一台电脑作为客户,我们主动使用connect()方法来搜索服务器端的IP地址(在Linux中,你可以用$ifconfig来查询自己的IP地址)和端口,以便客户可以找到服务器,并建立连接:

# Written by Windy

# Client side

import socket

# Address

HOST = '172.20.202.155'

PORT = 8000

request = 'can you hear me?'

# configure socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((HOST, PORT))

# send message

s.sendall(request)

# receive message

reply = s.recv(1024)

print 'reply is: ',reply

# close connection

s.close()

现在,我们写出一个HTTP服务器端:

#coding=utf-8

#Python HTTP服务器端

'''

自己编写一个HTTP服务器端使用socket

'''

#Written by Winy

import socket

import datetime

#Address

HOST=''

PORT=8882

# Prepare HTTP response

today = datetime.datetime.now()

text_content = '''HTTP/1.x 200 OK

Content-Type: text/html

WOW

Wow, Python Server

'''+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") +'''

Wow, Python Server

'''

# Read picture, put into HTTP format

f = open('test.jpg','rb')

pic_content = '''

HTTP/1.x 200 OK

Content-Type: image/jpg

'''

pic_content = pic_content + f.read()

f.close()

# Configure socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((HOST, PORT))

# infinite loop, server forever

while True:

# 3: maximum number of requests waiting

s.listen(3)

conn, addr = s.accept()

request = conn.recv(1024)

print request

method = request.split(' ')[0]

src =request.split(' ')[1]

# deal with GET method

if method == 'GET':

# ULR

if src == '/test.jpg':

content = pic_content

else: content = text_content

print 'Connected by', addr

print 'Request is:', request

conn.sendall(content)

# close connection

conn.close()

使用浏览器实验

为了配合上面的服务器程序,我已经在放置Python程序的文件夹里,保存了一个test.jpg图片文件。我们在终端运行上面的Python程序,作为服务器端,再打开一个浏览器作为客户端。(如果有时间,你也完全可以用Python写一个客户端。原理与上面的TCP socket的客户端程序相类似。)

测试#

在浏览器的地址栏输入:

127.0.0.1:8882

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值