在 Debian 上做 Python 网络编程,很多人最先卡住的不是语法,而是不清楚一条 TCP 连接到底该从哪里起步。本文直接用 socket 标准库搭一个最小可运行的服务端和客户端,顺着“创建套接字、建立连接、收发数据、关闭连接”这条主线展开,帮助你判断这个示例能解决什么问题,以及后续扩展时该往哪些方向继续深入。
为什么在 Debian 上用 socket 入门网络编程
如果目标是先把网络通信跑通,Python 自带的 socket 库通常就是最直接的选择。它不需要额外安装第三方包,在 Debian 系统里开箱即可使用,适合先理解 TCP 服务端和客户端之间最基础的通信过程。
这类示例的价值不在于功能复杂,而在于把几个核心动作讲清楚:服务端负责监听地址和端口,客户端负责主动发起连接,双方再通过套接字完成数据收发。只要把这条链路跑通,后面无论是并发处理、异步 IO,还是更高层协议,都会更容易理解。
服务端怎么搭:监听 127.0.0.1:12345
先创建一个 tcp_server.py 文件,写入下面这段代码。这个服务端主要做四件事:创建套接字、绑定地址和端口、开始监听,然后循环处理客户端请求。

import socket
# 创建一个TCP/IP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定套接字到地址和端口
server_host = '127.0.0.1'
server_port = 12345
server_socket.bind((server_host, server_port))
# 监听传入连接
server_socket.listen(1)
print(f"Listening on {server_host}:{server_port}")
while True:
# 等待连接
connection, client_address = server_socket.accept()
try:
print(f"Connection from {client_address}")
# 接收数据
data = connection.recv(1024)
print(f"Received {data.decode()}")
# 发送数据
connection.sendall("Hello, client!".encode())
finally:
# 清理连接
connection.close()
这段代码里有几个关键点值得单独看清:
1. 套接字类型决定通信方式
socket.AF_INET 表示使用 IPv4 地址族,socket.SOCK_STREAM 表示使用 TCP。两者组合起来,就是一个典型的 TCP/IP 套接字。

2. bind() 指定监听地址
示例把服务端绑定在 127.0.0.1:12345。这意味着它只接受本机发起的连接,适合本地测试;如果后面要让局域网内其他机器访问,就需要重新考虑绑定地址和防火墙规则。
3. listen(1) 开始进入监听状态
listen(1) 让程序开始等待传入连接。这里的参数是监听队列长度,示例只保留了最基础的写法,重点是先把流程跑通,而不是处理复杂负载。
4. accept()、recv() 和 sendall() 串起一次请求
当客户端接入后,accept() 会返回连接对象和客户端地址;接着用 recv(1024) 接收最多 1024 字节数据,再通过 sendall() 把 Hello, client! 发回去。最后在 finally 中关闭连接,避免连接资源一直占着不释放。
写完后,用下面的命令启动服务端:
python3 tcp_server.py
运行成功后,终端会输出监听信息,表示服务端已经在等待连接:
Listening on 127.0.0.1:12345
客户端如何连接并接收返回消息
接下来新建一个 tcp_client.py,写入客户端代码:
import socket
# 创建一个TCP/IP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
server_host = '127.0.0.1'
server_port = 12345
client_socket.connect((server_host, server_port))
try:
# 发送数据
message = "Hello, server!"
client_socket.sendall(message.encode())
# 接收数据
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = client_socket.recv(1024)
amount_received += len(data)
print(f"Received: {data.decode()}")
finally:
# 关闭套接字
client_socket.close()
客户端的职责比服务端更直接,核心就是三步:创建套接字、连接服务端、发送并接收数据。
connect() 负责主动建立连接
这里同样使用 127.0.0.1 和 12345,必须与服务端保持一致,否则连接不会成功。因为示例是本地回环地址,所以服务端和客户端都运行在同一台 Debian 机器上。
sendall() 发送完整消息
客户端把 Hello, server! 编码后发送给服务端。使用 sendall() 的好处是,它会尽量把数据完整发出去,适合这种入门级的字符串消息传输。
循环接收返回内容
代码里通过 amount_received 和 amount_expected 控制接收循环,直到收到的总字节数达到预期为止。虽然这个写法比较基础,但能让读者意识到:TCP 是字节流协议,接收端不应想当然地假设一次 recv() 就能拿到完整响应。
客户端运行命令同样很简单:
python3 tcp_client.py
如果连接和通信都正常,服务端会打印收到的消息,客户端则会看到来自服务端的返回内容:
Received: Hello, client!
运行后应该看到什么结果
这组脚本的验证方式很直接:先启动服务端,再启动客户端。只要两端的地址、端口一致,且服务端已处于监听状态,就能完成一次本地 TCP 通信。
在服务端一侧,通常会依次看到连接来源和接收内容,例如:
Connection from ('127.0.0.1', 某个客户端端口)
Received Hello, server!
在客户端一侧,则会看到服务端回送的消息:
Received: Hello, client!
如果没有得到这组结果,通常应先检查三个地方:服务端是否已经执行 python3 tcp_server.py 并保持运行;客户端连接的 127.0.0.1 和 12345 是否写对;两段代码中的消息收发逻辑是否按原样保留。
这个示例适合入门,但离实际项目还有多远
这个例子已经足够说明 Debian 下 Python 网络编程的基本入口,也能帮助你理解最核心的 API:socket()、bind()、listen()、accept()、connect()、recv() 和 sendall()。
不过它仍然只是一个最基础的演示。在实际项目中,你往往还要继续处理多并发连接、引入异步 IO,或者在 TCP 之上设计更完整的应用层协议。也正因为如此,这个小例子的意义并不是“直接上线”,而是先把服务端和客户端之间最底层的通信机制摸清楚。
如果你刚开始接触这类开发,那么从这个示例起步是合适的:依赖少、环境简单、反馈直接,而且 Debian 环境下的 Python socket 模块本身就比较稳定可靠。先跑通一次本地通信,再逐步扩展功能,通常比一上来就引入复杂框架更容易建立正确理解。







