客户端与服务端基于HTTP和WebSocket网络协议来通讯,其中HTTP用于从客户端向服务端的请求,WebSocket用于从服务端向客户端的推送,因此服务器端需要支持HTTP和WebSocket两种协议。HTTP好说,所有Web服务器都支持,而支持WebSocket的倒不多。
.Net和Nodejs俺不熟,就不作评论,Tomcat 7在最新版本里加入对Websocket支持,但我需要更为轻量级的方案,最好是内嵌,因此Netty就成了我首选。Netty源码里有websocket的Samples,我就是直接在samples上进行修改,总结下来需要如下几步:
- 打开网络端口
(new Thread(new Runnable(){
@Override
public void run() {
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
// Set up the event pipeline factory.
bootstrap.setPipelineFactory(new WebSocketServerPipelineFactory());
int port = 8080;
// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(port));
System.out.println("Web socket server started at port " + port + '.');
}
})).start();
- 创建处理数据流的pipeline,特别是加入Websocket的handler
public class WebSocketServerPipelineFactory implements ChannelPipelineFactory {
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", new WebSocketServerHandler());
return pipeline;
}
}
- 实现在WebSocketServerHandler里实现messageReceived,接收网络数据。这里数据分为HTTP和WebSocket两种,如何是HTTP,那说明是处理最开始的Handshake阶段,这是需要为WebSocket建立握手
// Handshake
WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
this.getWebSocketLocation(req), null, false);
this.handshaker = wsFactory.newHandshaker(req);
if (this.handshaker == null) {
wsFactory.sendUnsupportedWebSocketVersionResponse(ctx.getChannel());
} else {
this.handshaker.handshake(ctx.getChannel(), req).addListener(WebSocketServerHandshaker.HANDSHAKE_LISTENER);
}
如果是WebSocketFrame,则接收客户端发来的message
String request = ((TextWebSocketFrame) frame).getText();
- 向客户端推送数据,这里只要是channel没关,并且能拿到channel对象即可
ctx.getChannel().write(new TextWebSocketFrame("some message"));
- 实现channelOpen、channelClosed等方法,实现对网络连接整个生命周期的监控
值得注意的是目前WebSocket的实现对二进制流支持不够好,因此当需要服务端向客户端推送类似与文件类IO流时,我采取的折中方案,就是先让websocket向客户端发通知,然后再让客户端向服务端请求文件下载,当然这样的代价就是两次连接,如果有更好的方案请推荐给我。
对于HTTP,Netty从原理上说是支持的,不过支持得不够好,最新的不稳定版本才有HTTP Request的解析支持,我也没太多时间来写这块,于是乎又找了另外一个可以内嵌的Web服务器Jetty来支持HTTP和servlet,当然我用了比较老版本的Jetty 6,这个版本比较轻量,内嵌比较简单,几行代码就可以打开网络端口并支持servlet:
(new Thread(new Runnable(){
@Override
public void run() {
int port = 8081;
Server server = new Server(port);
Context root = new Context(server,"/",Context.SESSIONS);
root.addServlet(new ServletHolder(new LoginSTServlet()), "/login");
try{
server.start();
System.out.println("Http server started at port " + port + '.');
}catch(Exception err){
err.printStackTrace();
}
}
})).start();
这样,几个类就搭起了服务端,当然这只是快速开始,服务端的建设远不止这些,比如security和数据压缩等,这些我单独拿出来详细分析
分享到:
相关推荐
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS、Android、微信小程序等多个平台。该资源有自己独到的见解,适合小白使用,有vue或小程序开发经验者更容易上手。
├─1113_AM_React-basic-1.mp4 ├─1113_AM_React-basic-2.mp4 ├─1113_AM_React-basic-4.mp4 ├─1113_PM_React-basic-3.mp4 ├─1114_AM_React-basic-5.mp4 ├─1114_AM_React-basic-6.mp4 ...
比较几款跨平台移动端开发app框架hybrid app flutter React WeeX不看好这个 kotlin也不看好 cordova phoneGap ionic hbuilder(uni-app) HERO
Delphi 7跨平台控件开发与应用(清晰版),经典的编程好书。共五个分卷。这是第三个。
移动跨平台开发工具 Project Mira-Objective-C and Swift.pdf
jQuery Mobile是目前*流行的跨平台移动开发框架,本书以实例驱动讲解的方式,让零基础的读者也能轻松掌握jQuery Mobile下的应用开发。本书分为4篇,*篇是移动开发入门篇,介绍了jQuery Mobile、HTML 5和移动开发的...
Delphi 7跨平台控件开发与应用(清晰版),经典的编程好书。共五个分卷。这是第四个。
Delphi 7跨平台控件开发与应用(清晰版),经典的编程好书。 共五个分卷。这是第一个。
iNet 是跨平台服务器开发组件,包括:网络库、消息队列、定时器、RPC、协程库。 地址:https://github.com/IronsDu/accumulation-dev 请参阅测试代码:examples。 特点:跨平台,效率非常高,安全,可复用,...
由于基于C++和STL特点使其广泛应用于游戏开发、移动互联网产品开发,目前最新版本为3.0alpha,由于其代码的开源特性和跨平台支持,可以快速开发移动游戏并部署到Android、iOS等平台,已经有超过百款的Ccoos2d-x的...
Delphi 7跨平台控件开发与应用(清晰版)ooH无加密 第二分卷
REACT NATIVE跨平台移动项目实战参考:现实中,Android和iOS两大移动操作系统分庭抗礼的局面决定了注定会有类似RN这样跨平台移动开发框架的出现,只不过各家实现的思路不同而已。
构建跨平台APP-jQuery.Mobile移动应用实战
《构建跨平台APP:Phonegap移动应用实战》是一本APP实战书,包含20多个APP实例和3个APP项目,还结合了HTML5移动开发。本书面向移动开发入门人员,低门槛,浅阅读,最适合移动APP创业小白。
Delphi 7跨平台控件开发与应用(清晰版),经典的编程好书。共五个分卷。这是第五个。
linux-winows-跨平台开源图形库 SDL-1.2, 对开发游戏的人很有帮助,对普通的linux用户 windows用户都有很大的参考价值。
windows linux—unix 跨平台通信集成控制系统 ,服务器端,实现对客户端的管理,详细内容参照: http://blog.csdn.net/wangyaninglm/article/details/41940287
这是一部学习wxWidgets的基础文档,能够让你快速的学习
Xamarin是一个跨平台开发框架,这一框架的特点是支持用C#开发IOS、Android、Windows Phone和Mac应用,这套框架底层是用Mono实现的。 Mono是一款基于.NET框架的开源工程,包含C#语言编译器、CLR运行时和一组类库,能...