从上学期期末开始就尝试写一个聊天工具,从最开始的Java IO,由于Java代码是运行在JVM上的,一方面即时是一个简单的客户端程序,同样会占用不少的内存,另一方面Java本身就不适合写客户端程序,让用户装JVM这件事本事就很扯淡。为了解决内存占用问题,这学期开始将服务器端的代码改为了Java NIO,通过NIO中的selector(轮询)来减少服务器端CPU和内存占用,在完成一个最初的model后,就开始尝试将其改为B/S架构的,随即发现不少问题。
B/S架构和C/S架构
以前,一直认为能用C/S实现的都可以用B/S架构来实现,除了那些大型游戏之类的。毕竟现在的整个趋势都在向移动化发展,手机端的app甚至就是界面里面套个浏览器。
在我尝试将这个简单的model改为B/S架构时,突然发现写不下去,由于在C/S架构中,服务器会不定时的向客户端发送消息,客户端有一个单独的线程从服务器接受消息,然而在B/S架构中,首先客户端这个单独的线程很难实现,即使实现也会直接将压力加到服务器上,这样肯定是不行的。另一方面无法做到从服务器向浏览器发送消息。
经过查找资料后得知,现在大部分的网页在线聊天都是通过轮询的方式,浏览器会间隔一段时间(例如1s)就向服务器发送请求刷新页面。这种方式肯定会占用较多用户较多的CPU。
- B/S和C/S区别
C/S 是双向的通讯,建立连接后会一直保持,任何一方都可以随时向对方发送信息。比如 QQ 客户端登录后,腾讯的服务器可以随时把新的消息发给客户端,客户端也可以随时向腾讯的服务器发送信息、
B/S 是「查询」式的通讯,客户端向服务器查询一些信息,在服务器回应之后,(逻辑上)会立刻断开连接。只有客户端向服务器查询时,服务器才能向客户端发送信息,服务器不能主动地向客户端发送信息。
WebSocket
对于网页聊天而言,现在还有另一种解决方案,WebSocket,这是一种升级的http协议,可以实现浏览器和客户端的双向通信,而且不少代码都可以实现。都是需要浏览器支持,如今,除了上古年代的IE浏览器之外,大部分的浏览器应该是都支持。学习中…..