import socket
import ssl
def parsed_url(url):
protocol = 'http'
if url[:7] == 'http://':
u = url.split('://')[1]
elif url[:8] == 'https://':
protocol = 'https'
u = url.split('://')[1]
else:
u = url
i = u.find('/')
if i == -1:
host = u
path = '/'
else:
host = u[:i]
path = u[i:]
# 默認端口
port_dict = {
'http': 80,
'https': 443,
}
port = port_dict[protocol]
if host.find(':') != -1:
h = host.split(':')
host = h[0]
port = int(h[1])
return protocol, host, port, path
# 分析 url,得到協(xié)議,主機,端口,路徑
def socket_by_protocol(protocol):
""""
根據(jù)協(xié)議返回一個 socket 實例
"""
if protocol == 'http':
s = socket.socket()
else:
s = ssl.wrap_socket(socket.socket())
return s
# 客戶端 接收 響應
def response_by_socket(s):
response = b''
buffer_size = 1024
while True:
r = s.recv(buffer_size)
if len(r) == 0:
break
response += r
return response
# 分析響應得到 status_code,headers,body
def parsed_response(r):
header, body = r.split('\r\n\r\n', 1)
h = header.split('\r\n')
status_code = h[0].split()[1]
status_code = int(status_code)
headers = {}
headers = {}
# for line in h[1:]:
# k, v = line.split(': ')
# headers[k] = v
for line in h[1:]:
k, v = line.split(': ')
headers[k] = v
return status_code, headers, body
def get(url):
# 用 GET 請求 url并返回響應
protocol, host, port, path = parsed_url(url)
s = socket_by_protocol(protocol)
s.connect((host, port))
request = 'GET {} HTTP/1.1\r\nhost: {}\r\nConnection: close\r\n\r\n'.format(path, host)
encoding = 'utf-8'
s.send(request.encode(encoding))
response = response_by_socket(s)
r = response.decode(encoding)
status_code, headers, body = parsed_response(r)
if status_code == 301:
url = headers['Location']
return get(url)
return status_code, headers, body
def main():
url = 'g.cn'
status_code, headers, body = get(url)
print(status_code, headers, body)
if __name__ == '__main__':
main()
客戶端的接收
最后編輯于 :
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門颊亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陨溅,你說我怎么就攤上這事终惑。” “怎么了门扇?”我有些...
- 文/不壞的土叔 我叫張陵雹有,是天一觀的道長。 經(jīng)常有香客問我臼寄,道長霸奕,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任吉拳,我火速辦了婚禮质帅,結果婚禮上,老公的妹妹穿的比我還像新娘留攒。我一直安慰自己煤惩,他們只是感情好,可當我...
- 文/花漫 我一把揭開白布炼邀。 她就那樣靜靜地躺著魄揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拭宁。 梳的紋絲不亂的頭發(fā)上洛退,一...
- 文/蒼蘭香墨 我猛地睜開眼桶蝎,長吁一口氣:“原來是場噩夢啊……” “哼驻仅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起登渣,我...
- 正文 年R本政府宣布,位于F島的核電站卵迂,受9級特大地震影響裕便,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜见咒,卻給世界環(huán)境...
- 文/蒙蒙 一偿衰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改览,春花似錦下翎、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至今妄,卻和暖如春郑口,著一層夾襖步出監(jiān)牢的瞬間鸳碧,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 前言 在項目開發(fā)中我們經(jīng)常遇到后端向前端進行消息推送肉迫,我們前端需要接收這些推送消息,并顯示出來稿黄。這里接收推送消息我...
- 我主要針對客戶端分享一下socket的簡單網(wǎng)絡通信 一杆怕、導入庫文件 <netdb.h> 二族购、創(chuàng)建 socket...
- 文章目的簡單的介紹一下客戶端如何和后臺交互寝杖,以簡單的注冊為例;PHP代碼編寫可以使用PhpStorm互纯,mac環(huán)境下...
- packagework11; importjava.io.*; importjava.net.*; public ...