Python Socket入门学习

 更新时间:2026年07月27日 09:24:34   作者:夜雪一千  
本文介绍了使用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入门内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈python为什么不需要三目运算符和switch

    浅谈python为什么不需要三目运算符和switch

    下面小编就为大家带来一篇浅谈python为什么不需要三目运算符和switch。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Python实现自定义异常堆栈信息的示例代码

    Python实现自定义异常堆栈信息的示例代码

    当我们的程序报错时,解释器会将整个异常的堆栈信息全部输出出来。解释器会将异常产生的整个调用链都给打印出来,那么问题来了,我们能不能自定义这些报错信息呢?本文就来为大家详细讲讲
    2022-07-07
  • python列表中常见的一些排序方法

    python列表中常见的一些排序方法

    在Python实际开发中会经常需要用到对列表进行排序,下面这篇文章主要给大家介绍了关于python列表中常见的一些排序方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Python编程产生非均匀随机数的几种方法代码分享

    Python编程产生非均匀随机数的几种方法代码分享

    这篇文章主要介绍了Python编程产生非均匀随机数的几种方法代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • TensorFlow如何指定GPU训练模型

    TensorFlow如何指定GPU训练模型

    这篇文章主要介绍了TensorFlow如何指定GPU训练模型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 使用BeeWare实现iOS调用Python方式

    使用BeeWare实现iOS调用Python方式

    这篇文章主要介绍了使用BeeWare实现iOS调用Python方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 十分钟搞定pandas(入门教程)

    十分钟搞定pandas(入门教程)

    这篇文章主要介绍了十分钟搞定pandas(入门教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python时间序列数据的预处理方法总结

    Python时间序列数据的预处理方法总结

    这篇文章主要介绍了Python时间序列数据的预处理方法总结,时间序列数据随处可见,要进行时间序列分析,我们必须先对数据进行预处理。时间序列预处理技术对数据建模的准确性有重大影响
    2022-07-07
  • python实现五子棋程序

    python实现五子棋程序

    这篇文章主要为大家详细介绍了python实现五子棋程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Python编程实现下载器自动爬取采集B站弹幕示例

    Python编程实现下载器自动爬取采集B站弹幕示例

    这篇文章主要介绍了使用Python编程来实现一个下载器可以自动爬取采集B站弹幕的示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10

最新评论