补全:用 select 挑就绪的
(每道题开头都有同一段:上面的内存版 TCP。) 贯穿全条的内存版 TCP(判题机不联网;接口和真 socket 一样,真机上把它换成 socket.socket() 就是真的): net = Net() lis = listen(net,
补全:广播给所有人
(每道题开头都有同一段:上面的内存版 TCP。) 贯穿全条的内存版 TCP(判题机不联网;接口和真 socket 一样,真机上把它换成 socket.socket() 就是真的): net = Net() lis = listen(net,
为什么要自己定协议
TCP 已经把字节按序送到了,为什么还要自己设计一个消息协议?因为【0】。
划边界的三种办法
在字节流上切出「一条消息」,常见的三种办法是【0】。
长度前缀好在哪
用「长度前缀」而不是「分隔符」划边界,主要好处是【0】。
长度前缀切一条
本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +
补全:给消息加长度前缀
本节的切包小工具: Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 + 粘包) recv_exactly(chunks, n) 从陆续到
补全:从流里拆消息
本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +
补全:分隔符版拆行
本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +
补全:一个键值协议
本节的最小键值协议: req("PUT", "k", "v") → b"PUT k v\n" 一行一条命令,空格分隔、换行结尾 decode(line)