1.我写这个程序的原因:
在看了Beego包的官方聊天室例程后,想借用他们优秀的思想架构,自己利用net包复刻一个类似的程序出来。但在实际开始敲了之后发现看似简单的例程,对于我一个新手来说,想复刻同样的优秀架构还是比较困难的。
2.写在前面
a、客户端程序需按指令执行,(选择模式时只能输入A或B,进入聊天室内后可随意输入,但不可输入“退出”,“退出”代表关闭客户端)
b、该程序存在弊端,服务器端退出机制没有设计,没有好的idea
c、设计程序时在消息前附加A|B来判断聊天模式,根据聊天模式选择执行的程序段。
3.再次得到的教训
客户端循环读取消息时需要用到strings.split切割掉前缀并进行索引。如果此时退出客户端,读取不到任何消息会有索引越界的风险。(我当时未考虑到,导致报错),需要首先判断读取到的消息不为空,在往下执行切割(因为只要有消息发送就附带模式前缀,因此可以发送空字符串)(具体见下面程序)。
4、存在需优化地方
我把单人聊天,和多人聊天(实际群内只有一个人)分为了两种情况,导致程序冗余变多。其实两种情况可以统归到多人聊天模式(单人)。
另外因为是新手,代码以及逻辑看起来难免垃圾,代码质量难免劣质,后面需要努力。
*********客户端程序
func main() {
/**********************************聊天拨号选择部分**********************************/
Conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
log.Fatal("请求出错")
}
defer Conn.Close()
/**********************************聊天模式选择部分**********************************/
/*定义模式变量
*/
var Module2 string
/*获得模式结果
*/
Module2 = SelectModule()
/**********************************针对模式进行预处理部分**********************************/
/*定义发送信息的固定部分
*/
var SendMsg = strings.Trim(Module2, "\n") + "|"
/* 进行聊天前的准备工作
*/
Prepare(Con