基本上windows平台下的几种IO模型都实现了一遍,还有两个没有实现,但是它们一个需要基于windows消息,一个和重叠IO中的事件通知模型比较类似,并且不能实现真正的异步,所以就不列出来了。
这一篇介绍如何实现一个聊天室。前面介绍的几种模型中除了基本的socket模型和阻塞版本的模型之外都可以用来实现聊天室,因为这两个模型还不能实现支持多个客户端。对于其它的几个模型,我们需要做的只是在原来模型的基本上维护一个socket连接的列表即可。这里使用完成端口来实现聊天室。使用其它的模型基本上也是这个思路,之所以使用这个是因为它不像多线程那样耗费资源,也不像selelct和重叠IO中基于事件通知的模型那样有连接限制,相比与重叠IO中的完成例程模型,不需要考虑负载均衡的问题。所以就是它了。
1.程序运行流程
先插入几张程序运行的截图。
1.1.启动服务器端的程序和客户端的程序
下图左侧是服务器端程序的启动界面,右图是客户端启动的界面。
对服务器端而言:
- 第一行代表的是本机的ip地址,也就是服务器端的ip地址,客户端中服务器ip地址这一栏需要填上这个地址;
- 端口号表示服务器端绑定的端口号,这个端口号可以自己指定。客户端中对应的端口号需要填上服务器端绑定的这个端口号,这样客户端才可以连上上服务器端。
对客户端而言:
- 服务器ip地址填上服务器端指定的ip地址,端口填上服务器端绑定的端口号;
- 如果客户端和服务器端在同一台机器上启动,此时的客户端中填写的服务器ip地址是正确的,否则需要根据服务器端的ip地址更改;
- 客户端需要指定一个昵称,用来标示不同的客户端,这个标示不能为空;
- 这里我允许有重复的昵称,如果不允许,只需要加上一定的判断就可以了。
1.2.点击服务器端的开启服务器
点击了开启服务器后,服务器才会启动,此时在下面的“信息”栏中会显示“创建启动线程成功!”,“服务器端已启动......”等字样。
1.3.客户端连接服务器
服务器端启动以后客户端就可以连接服务器了,现在“昵称”后面的编辑框中输入一个昵称,接着点击“连接服务器”按钮即可。
客户端会提示“连接服务器成功!”,“allanxia成功登陆!”这两行文字。
服务器端会提示“客户端连接:10.11.163.113:707”,“allanxia 登陆成功!”,其中第一条消息指示的是连接的客户端的ip地址和端口号,第二条信息指示的是客户端的昵称。
如果又有一个客户端连接,如下图:
会发生下面的情况:
服务端会受到Bill Gates的登陆信息;
已经连接的客户端(这里只有allanxia)也会收到他的登陆信息;
自身也会收到登陆消息。
接着再连接一个客户端:和上面同样的原理。
1.4.客户端通信
现在allanxia这个客户端发送一条消息“大家好,我是allanxia”,所有的客户端就都收到这个消息了。
现在大家就可以畅所欲言了。这就是基本的模型了,如果有客户端退出,服务器端会收到通知,但是客户端就不会收到通知了,这就是聊天室的基本模型了。
2.程序分析
这里我使用的是完成端口的模型,原理上讲其它几个支持多客户端的模型都可以用来实现这个聊天室。