简易聊天软件
这是本科计算机网络课程的作业
作业一
实现功能
- 客户端和服务器端互发消息
不足之处
- 如果直接关闭会话窗口的话会使另一端陷入死循环。
- 界面不是非常友好。
- 虽然可以有多个客户端同时给服务器端发消息,但是服务器端只能给一个客户端发消息。
程序设计
服务器端
- 有个线程数组,存放连接的接收消息线程和发送消息线程。
- 接收消息线程和发送消息线程同时工作。
客户端
- 接收消息线程和发送消息线程同时工作。
学习经验
- 要有两个线程,一个管理接收消息,一个管理发送消息。
运行截图
作业二
实现功能
- 用昵称和密码注册,昵称可以相同,用id和密码登入。
- 如果通信的id在线的话,会直接显示给对方,否则插入数据库,等待对方上线后发送给对方。
- 可以昵称相同,但是要用id登入。
不足之处
- 消息中不能有空格,有空格的话会按多个消息传送
- 1给2发消息时,2必须在选择和2通信之前登入才算在线,在选择之后登入不算在线。(也就是做不到在线人数和状态时时刷新)。
- 服务器端最多可以在线认数由MAXCLIENTS控制,但是客户端退出之后,服务器端依然算作在线。
程序设计
服务器端
MySQLManage.h文件是封装了和数据库通信的一些原语。
util.h文件是一些处理格式转换的函数封装,比如:
- 将字符串分割为vector再分装成map。
- 得到当前时间 YY-MM-DD HH:MM:SS形式以方便插入数据库。
- char * 和 string的相互转换
- 字符串前后加单引号(数据库更新插入时字符串要被单引号包裹)
服务器端只有接受消息线程。
客户端和服务器端的消息分为三种:
- init_mess=1,初始化消息,用于标识登入注册和正常发送消息,而登入和注册的分别是用关键字nick_name,没有nick_name的消息是登陆,否则是注册。
- init_mess=2,通信消息,正常通信,通信内容有:from_id,to_id,time,content。
- init_mess=3,表示要接受接受的离线消息。
客户端
- 与客户端-服务端不同(发送消息线程和接受消息线程同时开启),客户端-客户端通信的接受消息线程在控制信息初始化之后再开启。其实也可以用信号量,当初始化完成后增加一个信号量,之前的话接受消息线程wait即可。
- 先选择登入还是注册,注册完成后也要登入。
- 登入完成后输入通信的to_id。之后先接受离线消息,再进行在线通信。
- 客户端有两个线程,一个发送消息线程,一个接收消息线程。
学习经验
运行截图
欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。