在学习了socket编程相关内容之后,实现一个简单的聊天功能的程序应该是没有难度了,不过话虽然是这样说,但是要考虑的点说实话一点也不少,要是没有清晰的思路,很可能会出现很多莫名其妙的bug。不过,就算是理清了思路,bug也挺多的。
首先要明确的是我们要实现的是客户端之间的通信,可不是服务器和客户端之间的通信,这点很重要,因为纯粹服务器和客户端的交互说实话写起来没什么意思。
然后就是具体实现思路了,简单来说就是客户端向服务器发送一条请求,里面包含了要向另一个客户端发送的消息,然后服务器经过处理这条消息再发送给另一个客户端,但既然我们是聊天室的话那肯定要考虑客户端有没有连接,通俗来说就是是不是处于离线状态,还要考虑服务器如何得知我们要发送消息给哪个客户端,这样的话就需要存储已连接客户端的套接字,而且服务器应该需要同时处理多个客户端的请求,所以我们的服务器需要同时去处理所有来自客户端的请求,这样一来的话我们的程序就算考虑的比较圆满了。
第一步,我们先确定要用什么方式去处理我们上述提到的问题,对于存储问题,聊天室的话肯定会有账号啊,昵称啊,密码啊之类的东西,初步考虑是使用文件去存储,不过这样一想我的多少个文件啊,不同的信息需要存储在不同的文件当中,而且对文件的操作还不是一件很有效率的事情,比较麻烦,所以最后还是决定用数据库去存储数据。关于C语言如何应用数据库进行存储之类的操作,详情请百度
对于同时处理的问题,我们都知道,服务器要接收来自客户端的连接时,需要时刻处于接收连接即accept状态,但是这样就造成一个问题,服务器到底是应该接收连接请求呢,还是接收其他来自客户端的处理事件的请求呢,或者说是,现在已经连接了好多个客户端在服务器山,如果所有服务器同时向服务器发送请求的话,那我服务器该处理哪一个呢,这时候我们就提供了两种解决思路,第一种是使用多线程,对每个连接到的客户端都开一个线程去处理;第二种方法呢就是采用多路复用,建议用epoll,但其实连接的客户端如果比较少的话select和poll反而效率会更好一点。关于多路复用详情请百度,不过多线程的话,用上去比较简单,想起来也好实现,所以最终决定采用多线程的方式。
关于代码,将会在下一篇博客中给出,完善一下再发出来,不然如果有bug的话那就很尴尬了。