30天学会Python编程:16.Python网络编程
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
|
Python标准库中的HTTP客户端实现:
from http.client import HTTPConnection
conn = HTTPConnection("example.com") # 创建连接
conn.request("GET", "/") # 发送GET请求
resp = conn.getresponse() # 获取响应
print(resp.status, resp.reason) # 状态码和原因短语
print(resp.read().decode()[:100]) # 读取响应内容
第三方库,提供更简洁的API:
import requests
# GET请求示例
resp = requests.get("https://api.github.com/events")
print(resp.json()[0]['id']) # 解析JSON响应
# POST请求示例
resp = requests.post("https://httpbin.org/post",
data={'key': 'value'}, # 表单数据
headers={'X-Test': 'true'}) # 自定义请求头
print(resp.json()) # 输出JSON响应
HTTP编程技巧:
WebSocket提供全双工通信通道,适合实时应用。
import asyncio
import websockets
# 服务端实现
asyncdefecho(websocket):
asyncfor message in websocket:
await websocket.send(f"Echo: {message}")
asyncdefws_server():
asyncwith websockets.serve(echo, "localhost", 8765):
await asyncio.Future() # 永久运行
# 客户端实现
asyncdefws_client():
asyncwith websockets.connect("ws://localhost:8765") as ws:
await ws.send("Hello WebSocket!")
print(await ws.recv()) # 接收响应
# 启动服务端和客户端
asyncdefmain():
server = asyncio.create_task(ws_server())
await asyncio.sleep(1) # 等待服务端启动
await ws_client()
server.cancel()
asyncio.run(main())
WebSocket特点:
异步I/O允许单线程处理多个并发连接。
import asyncio
asyncdefhandle_echo(reader, writer):
data = await reader.read(100) # 异步读取数据
message = data.decode()
writer.write(data.upper()) # 发送响应
await writer.drain() # 等待写入完成
writer.close() # 关闭连接
asyncdefasync_tcp_server():
server = await asyncio.start_server(
handle_echo, '127.0.0.1', 8888)
asyncwith server:
await server.serve_forever() # 永久运行
asyncdefasync_tcp_client():
reader, writer = await asyncio.open_connection(
'127.0.0.1', 8888)
writer.write(b"hello world") # 发送数据
data = await reader.read(100) # 等待响应
print(f"Received: {data.decode()}")
writer.close() # 关闭连接
asyncdefmain():
server = asyncio.create_task(async_tcp_server())
await asyncio.sleep(1) # 等待服务器启动
await async_tcp_client()
server.cancel() # 停止服务器
asyncio.run(main())
异步编程优势:
关键概念:
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
classAPIHandler(BaseHTTPRequestHandler):
defdo_GET(self):
ifself.path == '/api/data':
self.send_response(200) # 成功状态码
self.send_header('Content-Type', 'application/json')
self.end_headers()
data = {'status': 'ok', 'data': [1,2,3]}
self.wfile.write(json.dumps(data).encode()) # 发送JSON响应
else:
self.send_error(404) # 资源未找到
defrun_server():
server = HTTPServer(('localhost', 8000), APIHandler)
print("Server started on http://localhost:8000")
server.serve_forever() # 启动服务器
import socket
import time
from concurrent.futures import ThreadPoolExecutor
defcheck_port(host, port, timeout=1):
"""检查端口是否开放"""
try:
with socket.create_connection((host, port), timeout=timeout):
returnTrue
except (socket.timeout, ConnectionRefusedError):
returnFalse
defnetwork_scanner(host, ports, max_workers=50):
"""多线程端口扫描器"""
open_ports = []
defworker(port):
if check_port(host, port):
open_ports.append(port)
print(f"Port {port} is open")
with ThreadPoolExecutor(max_workers=max_workers) as executor:
executor.map(worker, ports) # 并行执行端口检查
returnsorted(open_ports)
# 使用示例
if __name__ == '__main__':
host = 'example.com'
ports = range(1, 1025) # 扫描1-1024端口
start = time.time()
open_ports = network_scanner(host, ports)
print(f"扫描完成,耗时 {time.time()-start:.2f}秒")
print(f"{host} 开放端口: {open_ports}")
网络工具开发技巧:
学习路径建议:
掌握Python网络编程是开发现代分布式应用的基础技能。通过本指南,我们已学习从底层Socket通信到高级异步网络应用的全面知识。继续实践这些概念,够构建高效、可靠的网络应用和服务。
阅读原文:原文链接