《TCP IP网络编程》学习笔记一
前言
网络编程还是很重要的,不过UNP一书过于厚重了,重点也不够突出。对比之下,尹圣雨的这本《TCP/IP网络编程》就比较简单易读。

阅读时跳过了所有Windows实现的部分,只重点阅读部分章节并敲代码,代码GitHub:linux-learn/tcpip-net
网络编程还是很重要的,不过UNP一书过于厚重了,重点也不够突出。对比之下,尹圣雨的这本《TCP/IP网络编程》就比较简单易读。

阅读时跳过了所有Windows实现的部分,只重点阅读部分章节并敲代码,代码GitHub:linux-learn/tcpip-net
Windows现在对开发者越来越友好了,有了WSL2且支持Docker,并且JetBrains的IDE也支持WSL2,开发环境改善了不少,Windows成为最好用的Linux发行版。
Windows的应用商店有一些高颜值的终端,作为传统的cmd与powershell终端的替代,视觉上提升了很多。powershell也有了新版,例如我目前在使用的PowerShell 7.1.5版本。
然而,对于在Linux上常用的oh-my-zsh,Powershell默认状态却并不美观,其命令提示符非常单调,也不能显示git仓库的分支。
在众多oh-my-zsh主题里,我比较喜欢ys主题,主要是因为比较简约,不需要特殊的字体,没有各种花里胡哨的效果,因此可以在各种终端环境下完整地显示。下面是Linux上ys主题与PowerShell基于starship的ys主题的对比效果:

ByteToMessageDecoder 和ReplayingDecoder;MessageToMessageDecoder
io.netty.handler.codec.LineBasedFrameDecoder:这个类在Netty 内部也有使用,它使用了行尾控制字符(\n 或者\r\n)来解析消息数据;
io.netty.handler.codec.http.HttpObjectDecoder:一个HTTP 数据的解码器。在io.netty.handler.codec 子包下面,你将会发现更多用于特定用例的编码器和解码器实现。
Netty 提供了TooLongFrameException 类,其将由解码器在帧超出指定的大小限制时抛出。
在上一篇的基于Netty实现简单的Redis客户端 - 木然轩 - 文剑木然的网络日志中我介绍了如何使用Netty来编写一个简单的Redis客户端。在本篇中,将使用Netty实现一个简单的Redis服务端。
完整的Redis 服务端的功能是很复杂的,由于是学习目的,这里只实现Redis最基本的一项功能,就是存取字符串,也就是下面的两个命令:
SET key value
GET key
由于Redis的协议在上一篇已经提过了,本篇就不再赘述了,直接上实现的过程。
Netty是Java中非常常用的网络库,它能自定义网络通信协议,从而实现非常丰富多样的网络功能。Redis是开发中非常常用的中间件,常用于缓存、分布式锁等场合,Redis的协议也非常简单。尽管Netty中自带了Redis的客户端,但是,为了学习,我们将不使用Netty自带的实现,而是自己动手写一个基础版本的Redis客户端。
Redis支持字符串、列表、集合等数据类型,考虑到是学习目的,只实现最最基础的功能,也就是设置与获取字符串的值。具体来说,就是下面两个命令:
# 设置指定key的值
SET key value
# 获取指定key的值
GET key
可以从 Redis协议详细规范 来了解Redis的协议。Redis的协议是基于字符串的而不是二进制的,这为协议的处理带来了许多便利。