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,得到协议,主机,端口,路径
def socket_by_protocol(protocol):
""""
根据协议返回一个 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()
客户端的接收
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 在项目开发中我们经常遇到后端向前端进行消息推送,我们前端需要接收这些推送消息,并显示出来。这里接收推送消息我...
- 我主要针对客户端分享一下socket的简单网络通信 一、导入库文件 <netdb.h> 二、创建 socket...
- 文章目的简单的介绍一下客户端如何和后台交互,以简单的注册为例;PHP代码编写可以使用PhpStorm,mac环境下...
- packagework11; importjava.io.*; importjava.net.*; public ...