Python–cookbook–11.网络与Web编程

Python–cookbook–11.网络与Web编程

相关介绍

# coding=utf8
from urllib import request, parse
import requests

# urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 
# 1. url 参数:目标资源在网路中的位置。可以是一个表示URL的字符串(如:http://www.pythontab.com/);也可以是一个urllib.request对象,详细介绍请跳转
# 2. data参数:data用来指明发往服务器请求中的额外的参数信息(如:在线翻译,在线答题等提交的内容),data默认是None,此时以GET方式发送请求;当用户给出data参数的时候,改为POST方式发送请求。
# 3. timeout:设置网站的访问超时时间
# 4. cafile、capath、cadefault 参数:用于实现可信任的CA证书的HTTP请求。(基本上很少用)
# 5. context参数:实现SSL加密传输。(基本上很少用)

# 作为客户端与HTTP服务交互
# 你需要通过 HTTP 协议以客户端的方式访问多种服务。例如,下载数据或者与基于 REST 的 API 进行交互。
# 对于简单的事情来说,通常使用 urllib.request 模块就够了。例如,发送一个简单的 HTTP GET 请求到远程的服务上
# Base URL being accessed
url = 'http://httpbin.org/get'
parms = {
    'name1': 'value1',
    'name2': 'value2'
}
# Encode the query string
querystring = parse.urlencode(parms)
# print(querystring)
# Make a GET request and read the response
u = request.urlopen(url+'?' + querystring)
resp = u.read()
# print(resp)

# 如果你需要使用 POST 方法在请求主体中发送查询参数,可以将参数编码后作为
# 可选参数提供给 urlopen() 函数
url2 = 'http://httpbin.org/post'
u2 = request.urlopen(url2, querystring.encode('ascii'))
resp2 = u2.read()
# print(resp2)

# 需要在发出的请求中提供一些自定义的 HTTP 头,例如修改 user-agent 字段,
# 可以创建一个包含字段值的字典,并创建一个 Request 实例然后将其传给 urlopen()
headers = {
    'User-agent': 'none/ofyourbusiness',
    'Spam': 'Eggs'
}
req = request.Request(url2, querystring.encode('ascii'), headers=headers)
# Make a request and read the response
u3 = request.urlopen(req)
resp3 = u3.read()
# print(resp3)

# 需要交互的服务比上面的例子都要复杂,也许应该去看看 requests 库
# data不需要urlencode编码
#resp4 = requests.post(url2, data=parms, headers=headers)
# print(resp4.text)  #  Unicode 解码的响应文本
# resp.content ,就会得到原始的二进制数据。
# resp.json ,那么就会得到 JSON 格式的响应内容
# resp.url  查看完整url地址
# resp.encoding  查看响应头部字符编码
# resp.status_code  查看响应码

# 利用 requests 库发起一个 HEAD 请求,并从响应中提取出一些HTTP 头数据的字段
# resp5 = requests.head('http://www.python.org/index.html')

# 利用 requests 通过基本认证登录 Pypi 的例子
#resp6 = requests.get('http://pypi.python.org/pypi?:action=login',
#        auth=('user', 'password'))
# print(resp6.text.encode('gbk', 'ignore').decode('gbk'))

# 利用 requests 将 HTTP cookies 从一个请求传递到另一个的例子
resp7 = requests.get(url)
resp8 = requests.get(url, cookies=resp7.cookies)
# print(resp7.cookies)

# 用 requests 上传内容
files = {'file': ('stock.csv', open('stock.csv', 'rb')) }
resp9 = requests.post(url, files=files)
# print(resp9.text)

# 通过 CIDR(无类别域间路由) 地址生成对应的 IP 地址集
import ipaddress
net = ipaddress.ip_network('123.45.67.64/27')
print(net, type(net))
# for add in net:
#     print(add)
print(net.num_addresses)
print(net[0])
a = ipaddress.ip_address('123.45.67.69')
print(a in net)

# 创建一个简单的REST接口

# 通过 XML-RPC 实现简单的远程调用

# 在不同的 Python 解释器之间交互

# 实现远程方法调用

# 简单的客户端认证

# 在网络服务中加入SSL

# 进程间传递 Socket 文件描述符

# 理解事件驱动的 IO

# 发送与接收大型数组

TCP-client

from socket import socket, AF_INET, SOCK_STREAM
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 20000))
print(s.send(b'Hello'))
print(s.recv(8192))

TCP-server

# coding=utf8
# 创建TCP服务器
from socketserver import BaseRequestHandler, TCPServer, StreamRequestHandler, ThreadingTCPServer
from threading import Thread
class EchoHandler(BaseRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        while True:
            msg = self.request.recv(8192)
            if not msg:
                break
            self.request.send(msg)
class EchoHandler2(StreamRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        # self.rfile is a file-like object for reading
        for line in self.rfile:
            # self.wfile is a file-like object for writing
            self.wfile.write(line)
# serv = TCPServer(('', 20000), EchoHandler)
# serv = TCPServer(('', 20000), EchoHandler2)

# 处理多个客户端
# serv = ThreadingTCPServer(('', 20000), EchoHandler)
# serv.serve_forever()

# 限制连接数
NWORKERS = 16
serv = TCPServer(('', 20000), EchoHandler)
for n in range(NWORKERS):
    t = Thread(target=serv.serve_forever)
    t.daemon = True
    t.start()
serv.serve_forever()

TCP-server-socket

from socket import socket, AF_INET, SOCK_STREAM
def echo_handler(address, client_sock):
    print('Got connection from {}'.format(address))
    while True:
        msg = client_sock.recv(8192)
        if not msg:
            break
        client_sock.sendall(msg)
    client_sock.close()
def echo_server(address, backlog=5):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(address)
    sock.listen(backlog)
    while True:
        client_sock, client_addr = sock.accept()
        echo_handler(client_addr, client_sock)
echo_server(('', 20000))

UDP-client

from socket import socket, AF_INET, SOCK_DGRAM
s = socket(AF_INET, SOCK_DGRAM)
print(s.sendto(b'', ('localhost', 20000)))
print(s.recvfrom(8192))

UDP-server

# coding=utf8
from socketserver import BaseRequestHandler, UDPServer, ThreadingUDPServer
import time
class TimeHandler(BaseRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        # Get message and client socket
        msg, sock = self.request
        resp = time.ctime()
        sock.sendto(resp.encode('ascii'), self.client_address)
serv = UDPServer(('', 20000), TimeHandler)
# serv = ThreadingUDPServer(('',20000), TimeHandler)
serv.serve_forever()

UDP-server-socket

from socket import socket, AF_INET, SOCK_DGRAM
import time
def time_server(address):
    sock = socket(AF_INET, SOCK_DGRAM)
    sock.bind(address)
    while True:
        msg, addr = sock.recvfrom(8192)
        print('Got message from', addr)
        resp = time.ctime()
        sock.sendto(resp.encode('ascii'), addr)
time_server(('', 20000))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柴寺仓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值