下面是对应的“python基础之Socket套接字详解”的完整攻略。
Python基础之Socket套接字详解
一、什么是Socket套接字
Socket套接字简称Socket,是提供应用程序和网络协议栈之间的接口,通过Socket可以方便地实现应用程序之间的数据传输和网络通信,比如HTTP、SSL、SSH、FTP等各种应用层协议都是基于Socket实现的。
二、Socket套接字基本使用方法
Python通过socket
模块实现了Socket套接字的支持,可以很方便地编写网络应用,大致的使用方法如下:
1. 创建套接字
在创建一个基于Socket的网络应用之前,需要先创建一个Socket对象,可以在创建时指定协议族和套接字类型,如下所示:
import socket
# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
其中,AF_INET
代表IPv4协议族,SOCK_STREAM
代表流式Socket套接字类型。
2. 绑定并监听端口
绑定端口用于使客户端和服务端建立连接,端口可以是任意未被占用的端口。使用bind
方法可以将端口绑定到Socket对象上。代码如下:
# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))
# 监听端口,等待客户端连接
s.listen(5)
此处将端口绑定到本地IP地址127.0.0.1
的8080端口,并设置Socket对象的监听队列长度为5。
3. 建立连接
在服务端通过accept
方法等待客户端连接,并且返回一个由客户端地址和端口组成的元组,使用该元组可以与客户端进行数据传输。代码如下:
# 等待客户端连接,返回一个由客户端地址和端口组成的元组
client, addr = s.accept()
4. 发送和接收数据
在Socket对象上,可以使用send
方法向其它Socket对象发送数据,使用recv
方法从其它Socket对象接收数据。用法如下:
# 发送数据
client.send('Hello World!')
# 接收数据
data = client.recv(1024)
# 关闭Socket对象
s.close()
在上述代码中,调用send
方法向客户端Socket对象发送数据Hello World!
,并使用recv
方法接收客户端Socket对象返回的数据,数据的最大传输长度为1024字节。最后,使用close
方法关闭Socket对象。
三、Socket套接字示例说明
下面,将通过两个示例对Socket套接字的使用方法进行说明,一个是简单的Echo服务器,另一个是简单的Web服务器。
1. Echo服务器
Echo服务器是一个简单的网络应用,它接收任何来自客户端的字符串,并将其原样返回给客户端。代码如下:
import socket
# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))
# 监听端口,等待客户端连接
s.listen(5)
while True:
# 等待客户端连接,返回一个由客户端地址和端口组成的元组
client, addr = s.accept()
print('客户端已连接', addr)
# 接收数据并将其发送回去
data = client.recv(1024)
client.send(data)
# 关闭连接
client.close()
在上述代码中,while
循环表示程序可以不断接收来自客户端的连接请求,并在每次成功连接后接收数据并将数据原样返回给客户端。
2. 简单的Web服务器
简单的Web服务器可以接收HTTP GET请求并返回一份静态HTML页面。代码如下:
import socket
# 创建一个IPv4 TCP协议的Socket套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到本地IP和端口
s.bind(('127.0.0.1', 8080))
# 监听端口,等待客户端连接
s.listen(5)
while True:
# 等待客户端连接,返回一个由客户端地址和端口组成的元组
client, addr = s.accept()
print('客户端已连接', addr)
# 接收数据并解析HTTP请求
data = client.recv(1024).decode()
lines = data.split('\r\n')
_, path, _ = lines[0].split()
# 返回静态HTML页面
with open('.' + path, 'rb') as f:
content = f.read()
header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\nConnection: close\r\n\r\n' % len(content)
client.send(header.encode() + content)
# 关闭连接
client.close()
在上述代码中,程序在循环中等待客户端连接、接收数据、解析HTTP请求、返回静态HTML页面。为了简单起见,此处直接返回本地文件系统中存在的HTML页面,并没有进行路由和视图等开发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python基础之Socket套接字详解 - Python技术站