网络编程和通信
基于Socket的网络编程
Socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关接口,让Socket去组织符合指定的协议数据然后进行通信。
TCP Socket
- servet
- 创建socket对象
- 绑定IP地址和端口号
- 监听连接
- 等待客户端连接
- 接收客户端数据
- 发送数据到客户端
- 关闭连接
# server.py
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '127.0.0.1'
port = 8080
# 绑定IP地址和端口号
s.bind((ip, port))
# 监听连接
s.listen(5)
# 等待客户端连接
while True:
c, addr = s.accept()
print('连接地址:', addr)
# 接收客户端数据
print(c.recv(1024).decode('utf-8'))
# 发送数据到客户端
c.send('hello'.encode('utf-8'))
# 关闭连接
c.close()
- client
- 创建socket对象
- 连接服务器
- 发送数据到服务器
- 接收服务器数据
- 关闭连接
# client.py
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '127.0.0.1'
port = 8080
# 连接服务器
s.connect((ip, port))
# 发送数据到服务器
s.send('hello'.encode('utf-8'))
# 接收服务器数据
print(s.recv(1024).decode('utf-8'))
# 关闭连接
s.close()
UDP Socket
- server
- 创建socket对象
- 绑定IP地址和端口号
- 接收数据
- 发送数据
- 关闭连接
# server.py
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = '127.0.0.1'
port = 8080
# 绑定IP地址和端口号
s.bind((ip, port))
while True:
# 接收数据
data, addr = s.recvfrom(1024)
if not data:
break
print('接收到数据:', data.decode('utf-8'))
# 发送数据
s.sendto('hello'.encode('utf-8'), addr)
# 关闭连接
s.close()
- client
- 创建socket对象
- 发送数据
- 接收数据
- 关闭连接
# client.py
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = '127.0.0.1'
port = 8080
# 发送数据
s.sendto('hello'.encode('utf-8'), (ip, port))
# 接收数据
new_data, addr = s.recvfrom(1024)
print(new_data.decode('utf-8'))
# 关闭连接
s.close()
基于urllib的网络编程
urllib
urllib提供了一系列用于操作URL的功能。
urllib.request
:打开和读取URLsurllib.error
:包含urllib.request
抛出的异常urllib.parse
:解析URLsurllib.robotparser
:解析robots.txt
文件urllib.response
:包含urllib.request
返回的对象
urllib.request
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
:打开URLsurl
:URLdata
:发送到服务器的数据timeout
:设置超时时间cafile
:CA证书文件capath
:CA证书路径cadefault
:是否使用默认的CA证书context
:SSL设置
import urllib.request
# 打开URL
response = urllib.request.urlopen('http://www.baidu.com')
# 读取URL
print(response.read().decode('utf-8'))
基于http的网络编程
http
http.client
:HTTP协议客户端http.server
:HTTP协议服务器端http.cookies
:HTTP协议Cookieshttp.cookiejar
:HTTP协议CookieJar
http.client
http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)
:创建HTTP连接host
:主机名port
:端口号timeout
:超时时间source_address
:源地址blocksize
:块大小
import http.client
# 创建HTTP连接
conn = http.client.HTTPConnection('www.baidu.com')
# 发送请求
conn.request('GET', '/')
# 获取响应
response = conn.getresponse()
# 读取响应
print(response.read().decode('utf-8'))
# 关闭连接
conn.close()