06.26自我总结
1.关于Socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket模板已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
- 注意:也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序,而程序的pid是同一台机器上不同进程或者线程的标识。
2.套接字工作流程

3.套接字的函数
s都为通过socket模块生成
复制import socket
socket.socket(socket_family, socket_type, protocal=0)
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s = socket(AF_INET, SOCK_STREAM)
1.服务器套接字函数
方法 |
用途 |
s.bind() |
绑定(主机,端口号)到套接字 注:(127.0.0.1)表示本地ip |
s.listen() |
开始TCP监听 |
s.accept() |
被动接受TCP客户的连接,(阻塞式)等待连接的到来 |
2.客户端套接字函数
方法 |
用途 |
s.connect() |
主动初始化TCP服务器连接 |
s.connect_ex() |
connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 |
3.公共用途的函数
方法 |
用途 |
s.recv() |
接收TCP数据 |
s.send() |
发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完) |
s.sendall() |
发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完) |
s.recvfrom() |
接收UDP数据 |
s.sendto() |
发送UDP数据 |
s.getpeername() |
连接到当前套接字的远端的地址 |
s.getsockname() |
当前套接字的地址 |
s.getsockopt() |
返回指定套接字的参数 |
s.setsockopt() |
设置指定套接字的参数 |
s.close() |
关闭套接字 |
4.面向锁套接字
方法 |
用途 |
s.setblocking() |
设置套接字的阻塞与非阻塞模式 |
s.settimeout() |
设置阻塞套接字操作的超时时间 |
s.gettimeout() |
得到阻塞套接字操作的超时时间 |
5.面向文件套接字
方法 |
用途 |
s.fileno() |
套接字的文件描述符 |
s.makefile() |
创建一个与该套接字相关的文件 |
4.示例
1.服务端
复制import socket
phone = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 8080))
phone.listen(5)
print('start....')
while True:
conn, client_addr = phone.accept()
print('已经有一个连接建立成功', client_addr)
while True:
try:
print('服务端正在收数据...')
data = conn.recv(1024)
if len(data) == 0: break
print('来自客户端的数据', data)
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
phone.close()
2.客户端
复制import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8080))
while True:
msg = input('>>: ').strip()
if len(msg) == 0: continue
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)
phone.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理