如果我们需要编写基于网络进行数据交互的程序,意味着我们需要自己通过代码来控制我们之前所学习的OSI七层(很繁琐,复杂,类似于我们自己编写操作系统)
socket类似于操作系统,封装了丑陋复杂的接口提供简单快捷的接口
socket也叫套接字
基于文件类型的套接字家族(单机)
AF_UNIX
基于网络类型的套接字家族(联网)
AF_INET

客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
while True:
msg = input('请输入您想要给服务端发送的消息>>>:').strip()
if len(msg) == 0:
print('消息不能为空')
continue
client.send(msg.encode('utf8'))
date = client.recv(1024)
print(date.decode('utf8'))
服务端
import socket
server = socket.socket()
name_list = ['张红', '李治']
"""
if fileno is None:
if family == -1:
family = AF_INET 基于网络的套接子
if type == -1:
type = SOCK_STREAM # 流式协议即TCP协议
if proto == -1:
proto = 0
"""
server.bind(('127.0.0.1', 8080))
server.listen(5)
sock, addr = server.accept()
print(sock, addr)
while True:
date = sock.recv(1024)
if date.decode('utf8') not in name_list:
print('你谁啊,不认识')
break
print(date.decode('utf8'))
msg = input('请输入您想要给客户端回复的消息>>>:')
sock.send(msg.encode('utf8'))
代码优化
1.聊天内容自定义
针对消息采用input获取
2.让聊天循环起来
将聊天的部分用循环包起来
3.用户输入的消息不能为空
本质其实是两边不能都是recv或者send,一定是一方收,一方发
4.服务段多次重启可能会报错
Address already in use 主要是mac电脑会报
方式1:改端口号
方式2:博客里面代码拷贝即可
5.当客户端异常断开的情况下 如何让服务端继续服务其他客人
windows服务端会直接报错
mac服务端会有一段时间反复接收空消息延迟报错
异常处理、空消息判断
半连接池的概念
server.listen(5)
当有多个客户端来链接的情况下,我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下
在测试半链接池的时候,可以不用input获取消息,直接把消息写死即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了