Python使用Socket模块实现TCP通信的完整示例

认真发呆
认真发呆
发布时间:2026-10-13 | 5人浏览过
原创

本文详细介绍如何使用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连接。希望以上内容能对您的学习有所帮助,也欢迎大家支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表