服务器端代码
import socket
# 创建套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 理解:AF_INET 表示使用 IPv4 协议,SOCK_STREAM 表示使用 TCP 协议
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 绑定地址(主机名、端口号)到套接字
server_socket.bind((host, port))
# 理解:bind 方法将套接字与特定的地址和端口关联,使得服务器可以在该地址和端口上监听连接请求
# 开始监听,最大连接数为5
server_socket.listen(5)
# 理解:listen 方法使服务器进入监听状态,参数指定了等待连接队列的最大长度
print('服务器已启动,等待客户端连接...')
while True:
# 接受客户端连接
client_socket, addr = server_socket.accept()
# 理解:accept 方法阻塞程序执行,直到有客户端连接过来,返回一个新的套接字对象(用于与客户端通信)和客户端的地址
print('连接来自:', addr)
# 接收客户端发送的数据
data = client_socket.recv(1024)
# 理解:recv 方法从套接字接收数据,参数指定了接收数据的最大长度
print('接收到的消息:', data.decode('utf-8'))
# 关闭与客户端的连接
client_socket.close()
客户端代码
import socket
# 创建套接字对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 连接到服务器
client_socket.connect((host, port))
# 理解:connect 方法用于客户端连接到指定的服务器地址和端口
message = 'Hello, Server!'
# 发送消息到服务器
client_socket.send(message.encode('utf-8'))
# 理解:send 方法将数据发送到已连接的套接字,数据需要编码为字节流
# 关闭套接字
client_socket.close()
对各步骤的理解
- 套接字创建:使用
socket.socket()
创建套接字对象,通过参数指定使用的地址族(如 AF_INET
表示 IPv4)和套接字类型(如 SOCK_STREAM
表示 TCP 流套接字)。这是网络通信的基础,它为程序提供了一个通信端点。
- 绑定:服务器端使用
bind()
方法将套接字绑定到一个特定的地址和端口。这个地址和端口就是服务器监听客户端连接的地方。绑定操作将套接字与网络中的特定位置关联起来。
- 监听:服务器通过
listen()
方法进入监听状态,等待客户端的连接请求。参数指定了等待连接队列的最大长度,超过这个长度的连接请求可能会被拒绝。监听使得服务器随时准备接受客户端的连接。
- 连接:客户端使用
connect()
方法连接到服务器的指定地址和端口。这个操作在客户端和服务器之间建立起一条通信链路,一旦连接成功,双方就可以开始交换数据。
- 数据收发:连接建立后,客户端使用
send()
方法将数据发送到服务器,服务器使用 recv()
方法接收客户端发送的数据。发送的数据需要编码为字节流,接收后的数据可能需要解码为原始格式。数据收发是实现应用层功能(如消息传递)的关键步骤。