Python使用Socket模块实现网络编程的入门指南

 更新时间:2026年07月26日 08:53:31   作者:detayun  
网络编程是后端开发、爬虫、即时通讯等场景的基础,而Socket就是实现网络通信最核心的接口,本文详细介绍了Python中使用socket模块进行网络编程的基础知识,感兴趣的小伙伴可以了解下

前言

网络编程是后端开发、爬虫、即时通讯等场景的基础,而Socket就是实现网络通信最核心的接口。很多初学者刚接触网络编程时,会被TCP、UDP、IP、端口等概念搞得一头雾水。本篇从基础概念出发,使用原生Python标准库socket,从零搭建服务端与客户端通信示例,带你快速上手Socket编程。

前置要求:掌握Python基础语法,无需深入网络底层原理。Python内置socket模块,不需要额外pip安装。

一、什么是Socket

Socket(套接字)可以理解为网络上两个程序通信的端点。

两台主机想要互相传递数据,一端开启服务监听,另一端发起连接,依靠IP地址+端口唯一标识一个Socket通信通道。

两种最常用通信协议:

  1. TCP:面向连接、可靠通信,数据不会丢失、顺序不变。通信前必须建立连接(三次握手),文件传输、聊天软件大多使用TCP。
  2. UDP:无连接、不可靠通信,不用建立连接,发送速度快,适合直播、语音通话、广播场景,可能丢包。

Python socket库同时支持TCP与UDP套接字。

二、TCP通信完整示例(重点)

TCP通信流程:

  • 服务端:创建socket → 绑定IP端口(bind) → 开始监听(listen) → 阻塞等待连接(accept) → 收发数据
  • 客户端:创建socket → 连接服务端(connect) → 收发数据

2.1 TCP服务端代码 server.py

import socket

# 1. 创建TCP套接字 SOCK_STREAM代表TCP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 绑定地址与端口,0.0.0.0代表监听本机所有网卡
HOST = "0.0.0.0"
PORT = 8888
server_socket.bind((HOST, PORT))

# 3. 开启监听,参数为允许等待的最大连接数
server_socket.listen(5)
print(f"服务端启动成功,监听端口:{PORT}")

# 4. 循环等待客户端接入
while True:
    # accept()阻塞,直到有客户端连接
    conn, addr = server_socket.accept()
    print(f"新客户端接入:{addr}")

    # 接收客户端数据,缓冲区大小1024字节
    data = conn.recv(1024)
    if not data:
        conn.close()
        continue
    print("收到客户端消息:", data.decode("utf-8"))

    # 向客户端发送响应
    resp = "服务端已收到你的消息!"
    conn.send(resp.encode("utf-8"))

    # 关闭当前客户端连接
    conn.close()

2.2 TCP客户端代码 client.py

import socket

# 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务端地址
HOST = "127.0.0.1"
PORT = 8888
client_socket.connect((HOST, PORT))

# 发送数据,socket只能传输字节流,字符串需要encode编码
msg = "Hello Socket!"
client_socket.send(msg.encode("utf-8"))

# 接收服务端返回消息
recv_data = client_socket.recv(1024)
print("收到服务端响应:", recv_data.decode("utf-8"))

# 关闭套接字
client_socket.close()

运行测试

  1. 终端先运行服务端:python server.py
  2. 新开终端运行客户端:python client.py

输出效果:

服务端控制台:
服务端启动成功,监听端口:8888
新客户端接入:('127.0.0.1', 51234)
收到客户端消息: Hello Socket!

客户端控制台:
收到服务端响应: 服务端已收到你的消息!

注意要点:

  • Socket传输只有bytes字节流,字符串必须encode(),接收后使用decode()解码;
  • 127.0.0.1仅本机访问;想要局域网其他设备连接,服务端绑定0.0.0.0,客户端填写服务端局域网IP;
  • 端口不能被其他程序占用,占用会抛出OSError。

三、UDP通信示例

UDP不需要建立连接,不需要listen和accept,收发更加轻量化。

UDP服务端 udp_server.py

import socket

# SOCK_DGRAM 代表UDP
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(("0.0.0.0", 9999))
print("UDP服务端启动,端口9999")

while True:
    data, addr = udp_server.recvfrom(1024)
    print(f"来自{addr}消息:{data.decode('utf-8')}")
    udp_server.sendto("UDP收到!".encode("utf-8"), addr)

UDP客户端 udp_client.py

import socket

udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_client.sendto("UDP测试消息".encode("utf-8"), ("127.0.0.1", 9999))
data, addr = udp_client.recvfrom(1024)
print("服务端回复:", data.decode("utf-8"))
udp_client.close()

四、常见踩坑总结

  1. 编码报错:收发忘记encode/decode,中文极易出现乱码,统一使用utf-8;
  2. 端口占用:修改PORT,或者关闭占用端口的进程;
  3. 客户端连不上:防火墙拦截、IP填写错误、服务端未绑定0.0.0.0;
  4. recv阻塞卡死:TCP连接断开后recv会返回空字节,代码中需要判断;
  5. 单次recv不能接收全部大数据:缓冲区有限,传输大文件需要循环接收。

五、进阶拓展方向

原生基础Socket仅实现一对一短连接通信,后续可以延伸学习:

  1. 使用多线程/多进程处理多个客户端并发连接;
  2. IO多路复用 select / selectors 实现高并发服务;
  3. 基于Socket实现简易聊天室、文件传输;
  4. 封装协议头,自定义通信数据包格式;
  5. 异步网络编程 asyncio socket;
  6. 第三方框架:Twisted、gevent。

结束语

Socket是网络编程的基石,HTTP、WebSocket底层依然基于Socket封装。熟练掌握原生socket模块,能帮助你理解各类网络框架底层通信逻辑。本篇示例均为最简可运行代码,建议手动敲一遍运行调试,加深理解。

到此这篇关于Python使用Socket模块实现网络编程的入门指南的文章就介绍到这了,更多相关Python Socket网络编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas如何将DataFrame 转为txt文本去除引号

    pandas如何将DataFrame 转为txt文本去除引号

    这篇文章主要介绍了pandas如何将DataFrame 转为txt文本去除引号,文中补充介绍了DataFrame导CSV txt || 每行有双引号的原因及解决办法,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Python实现统计文章阅读量的方法详解

    Python实现统计文章阅读量的方法详解

    这篇文章主要为大家详细介绍了如何溧阳Python语言实现统计文章阅读量的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • Python实现提高运行速度的技巧分享

    Python实现提高运行速度的技巧分享

    这篇文章主要为大家详细介绍了Python实现提高运行速度的相关技巧,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06
  • python判断列表的连续数字范围并分块的方法

    python判断列表的连续数字范围并分块的方法

    今天小编就为大家分享一篇python判断列表的连续数字范围并分块的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python的文本常量与字符串模板之string库

    Python的文本常量与字符串模板之string库

    这篇文章主要介绍了Python的文本常量与字符串模板string库,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助哟,需要的朋友可以参考下
    2021-05-05
  • python动态网页批量爬取

    python动态网页批量爬取

    这篇文章主要介绍了python动态网页批量爬取的方法,主要针对四六级成绩批量爬取,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Python单元测试简单示例

    Python单元测试简单示例

    这篇文章主要介绍了Python单元测试,结合实例形式分析了Python单元测试的简单定义、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-07-07
  • Python判断值是否在list或set中的性能对比分析

    Python判断值是否在list或set中的性能对比分析

    这篇文章主要介绍了Python判断值是否在list或set中的性能对比分析,结合实例形式对比分析了使用list与set循环的执行效率,需要的朋友可以参考下
    2016-04-04
  • python利用pyttsx3 API实现文本转语音处理

    python利用pyttsx3 API实现文本转语音处理

    这篇文章主要为大家详细介绍了Python如何利用pyttsx3 API实现文本转语音处理,文中有详细的示例代码,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Django-xadmin+rule对象级权限的实现方式

    Django-xadmin+rule对象级权限的实现方式

    今天小编就为大家分享一篇Django-xadmin+rule对象级权限的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论