前言
最近观看声哥的数据库项目,觉得特有意思,准备学习。一波大概学习过程是,对着项目实敲一遍,每实现一个小功能,就更新到git,以及推送到远程仓库中,每看到 Gitee 的提交树上面出现一个绿点,就会给自己一个正反馈。然而因为项目是最后一步才最终实现的,所以只能通过没有 Warning(s) 来判断自己的程序是否正确。
问题
因为项目是通过 C / S 交互的,即 server在 9999 端口开启并监听服务,然后 client 连接 server 端,通过网络向服务端传送 sql 语句,服务端根据语句进行解析,执行完毕后再返回给客户端,具体的执行结果
此时,问题出现了,当我的客户端输入 sql 语句时,无论如何都无法结束此次输入,
排查思路
此时的第一反应是 Debug,跟踪 sql 语句从客户端传输到服务端的全过程,但是没有成功…(可能是我菜)。经过一段时间的无用功后,开始
从 client 和 server 包的代码开始排查
首先是从服务端开始,服务端主要代码是建立服务的一个过程,而本次问题是客户端无法正确结束本次输入,所以转而开始排查客户端的代码
客户端的包主要是连接服务端开启的端口,内部实现一个命令行,进行 sql语句的输出,然而此时的代码也是没有问题的。
最终解决
最终想到定义了一个传输协议的包,此包中包含了编解码器的定义,排查后找到这样一句代码
private String hexEncode(byte[] buf) {
return Hex.encodeHexString(buf, true)+"\n";
}
\n 转义字符 回车 换行符 acsII 13
/n 就是字符串 /n 没有转义的意思 按原样输出
问题在于最后的 “\n” 上面,一开始的回车换行符写成了转义字符串导致最终的客户端输入没有结尾,因此服务端也不会有相应的接受