Python使用Socket模块实现TCP通信的完整示例
本文详细介绍如何使用Python标准库socket模块实现TCP通信。内容涵盖服务端创建Socket、绑定IP端口、监听连接及收发数据的核心步骤,以及客户端的连接与交互流程。附带包含超时设置、异常处理和资源释放的完整服务端与客户端代码示例,帮助开发者快速掌握Python网络编程基础。
Python Socket TCP通信基础
在Python中实现TCP通信,首先需要导入内置的socket模块。
服务端实现步骤与代码
1、服务端实现
服务端的主要操作流程如下:
(1)创建Socket对象:调用socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)。
其中,family参数用于指定地址族,可选值包括AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNIX、AF_CAN、AF_PACKET和AF_RDS。
type参数用于指定Socket类型,常用选项有SOCK_STREAM(流式Socket,对应TCP)和SOCK_DGRAM(数据报Socket,对应UDP),也可使用其他SOCK_*类型。
proto参数通常保持默认值0,表示使用默认协议。
fileno参数通常也保持默认值,除非需要复用已有的文件描述符。
(2)绑定IP地址和端口:调用socket.bind(address)。
address参数应为一个包含(host, port)的元组,指定服务器监听的IP和端口号。
(3)启动监听:调用socket.listen([backlog])。
backlog参数定义了请求队列的最大长度,可理解为允许的最大连接等待数。
(4)接受客户端连接:调用socket.accept()。
该方法返回一个元组(conn, address),其中conn是已连接的客户端Socket对象,address是客户端的网络地址。
(5)数据收发:使用socket.recv(bufsize[, flags])接收数据,或使用socket.send(bytes[, flags])发送数据。
bufsize参数指定接收数据的最大字节数限制。
bytes参数指定需要发送的数据字节内容。
(6)关闭连接:调用socket.close()释放资源。
服务端完整代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:tcpserver.py
import socket
import time
MaxBytes=1024*1024
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.settimeout(60)
host = '127.0.0.1'
#host = socket.gethostname()
port = 11223
server.bind((host, port)) # 绑定端口
server.listen(1) # 监听
try:
client,addr = server.accept() # 等待客户端连接
print(addr," 连接上了")
while True:
data = client.recv(MaxBytes)
if not data:
print('数据为空,我要退出了')
break
localTime = time.asctime( time.localtime(time.time()))
print(localTime,' 接收到数据字节数:',len(data))
print(data.decode())
client.send(data)
except BaseException as e:
print("出现异常:")
print(repr(e))
finally:
server.close() # 关闭连接
print("我已经退出了,后会无期")
本示例未创建额外线程,仅处理单个客户端连接。为确保accept和recv阻塞操作可被手动或自动中断,设置了60秒超时时间,并将核心逻辑置于try语句块中;同时将socket的关闭操作放入finally块,以防止程序异常退出时未能调用close函数导致资源泄漏。
客户端实现步骤与代码
2、客户端实现
客户端的主要操作流程如下:
(1)创建Socket:同样调用socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)。
(2)发起连接:调用socket.connect(address)。
address参数为一个包含(host, port)的元组,指定要连接的服务端IP和端口。
(3)数据收发:使用socket.recv(bufsize[, flags])接收数据,或使用socket.send(bytes[, flags])发送数据。
(4)关闭连接:调用socket.close()。
客户端完整代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:tcpclient.py
import socket
import time
MaxBytes=1024*1024
host ='127.0.0.1'
port = 11223
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.settimeout(30)
client.connect((host,port))
while True:
inputData=input(); #等待输入数据
if(inputData=="quit"):
print("我要退出了,再见")
break
sendBytes = client.send(inputData.encode())
if sendBytes<=0:
break;
recvData = client.recv(MaxBytes)
if not recvData:
print('接收数据为空,我要退出了')
break
localTime = time.asctime( time.localtime(time.time()))
print(localTime, ' 接收到数据字节数:',len(recvData))
print(recvData.decode())
client.close()
print("我已经退出了,后会无期")
上述客户端代码在连接成功后,会等待用户输入,并将输入信息发送至服务端。服务端将接收到的数据原样返回给客户端。若客户端输入“quit”,则跳出循环并关闭Socket;此时服务端recv将返回空数据,从而跳出循环并关闭Socket连接。希望以上内容能对您的学习有所帮助,也欢迎大家支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









