`
hyshucom
  • 浏览: 824035 次
文章分类
社区版块
存档分类
最新评论

跨平台移动开发实战(七)------服务器端快速搭建

 
阅读更多

客户端与服务端基于HTTP和WebSocket网络协议来通讯,其中HTTP用于从客户端向服务端的请求,WebSocket用于从服务端向客户端的推送,因此服务器端需要支持HTTP和WebSocket两种协议。HTTP好说,所有Web服务器都支持,而支持WebSocket的倒不多。

.Net和Nodejs俺不熟,就不作评论,Tomcat 7在最新版本里加入对Websocket支持,但我需要更为轻量级的方案,最好是内嵌,因此Netty就成了我首选。Netty源码里有websocket的Samples,我就是直接在samples上进行修改,总结下来需要如下几步:

  1. 打开网络端口
    (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();
  2. 创建处理数据流的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;
        }
    }
  3. 实现在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();
  4. 向客户端推送数据,这里只要是channel没关,并且能拿到channel对象即可
    ctx.getChannel().write(new TextWebSocketFrame("some message"));
  5. 实现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、egg实战直播app和小程序全栈开发.zip

    uni-app是一个基于Vue.js的多端开发框架,允许开发者用一套代码实现跨平台应用的开发,支持iOS、Android、H5、小程序等多个平台。它提供了一套统一的API,简化了多端适配的复杂性,大大提高了开发效率。在直播APP的...

    Qt及Qt Quick开发实战精解.pdf

    13. 移动与跨平台开发:了解如何利用Qt进行移动平台(如Android、iOS)的开发,以及跨平台应用程序的构建。 14. 实战案例分析:通过具体案例分析,运用上述知识点解决实际问题,加深对Qt及Qt Quick开发的理解。 ...

    2020年最新学习资源网盘地址分享.txt

    - **内容概述**: 该教程详细介绍如何使用Dart语言以及Flutter框架来开发跨平台移动应用。不仅涵盖了基础知识,还深入探讨了高级特性,适合希望快速上手Flutter的开发者。 - **学习目标**: 掌握Dart语言的基础语法,...

    用Android搭建客户端_手机和服务器交互开发实例

    #### 服务器端开发环境搭建 1. **SSH框架简介**:SSH是Spring、Struts2、Hibernate三个开源框架的简称,它们经常被组合在一起用于快速构建企业级应用。 - **Spring**:负责业务逻辑层管理。 - **Struts2**:处理...

    微信小程序开发-教育培训学校一体包案例源码.zip

    微信小程序作为移动开发的一部分,特别强调跨平台性和轻量化,适应各种操作系统,如Android和iOS。开发者可以使用微信官方提供的开发工具进行小程序的编写、调试和发布,这些工具集成了编辑器、模拟器和真机调试等...

    多端一体方案 Hippy的架构和实战.zip

    Hippy是一个由腾讯开源的高性能跨平台开发框架,它旨在提供一套统一的开发工具和接口,帮助开发者实现iOS、Android以及Web三端的无缝对接。 一、Hippy的架构设计 1. 虚拟DOM与渲染层分离:Hippy借鉴了React的虚拟...

    乐租租房工具.zip

    在这个案例中,我们关注的是微信小程序,它是跨平台的移动开发解决方案。微信小程序的优点在于它能够覆盖大量的微信用户,且开发成本相对较低,更新快速,用户体验良好。 3. **后端开发**: 在“乐租租房工具”中...

    Python3零起点教程-廖雪峰.pdf

    - **移动应用开发**:使用Kivy等框架开发跨平台移动应用。 #### 十五、总结 - **学习路径规划**:根据个人兴趣和发展方向制定合理的学习计划。 - **常见问题解答**:针对学习过程中遇到的问题提供解决方案。 - **...

    cocos2d-x权威指南完整版

    cocos2d-x是一款非常流行的跨平台游戏开发框架,支持iOS、Android等多个主流移动平台。它基于C++开发,并提供了高效的2D渲染引擎、物理引擎等丰富的功能,使得开发者能够快速地创建高质量的游戏应用。 **1.2 开发...

    最新千月影视双端APP源码 详细教程

    为了实现跨平台一致性,也可能使用React Native或Flutter等框架。 - **后端**:后端主要负责数据处理、用户认证、视频流传输等功能,一般基于如Node.js、Python(Django或Flask)、PHP(Laravel)等服务器端语言...

    JavaScript宝典第7版

    - **跨平台应用开发**:介绍如何借助Electron等工具开发跨平台桌面应用,以及面向移动设备的应用开发。 #### 三、学习路径建议 - **基础知识积累**:对于初学者来说,建议从JavaScript的基本语法和DOM操作开始学习...

    毕业设计:基于SpringBoot+MySql+UniApp的前后端分离在线学习平台系统-1.zip

    这个项目涵盖了多个IT领域的关键知识点,包括Web开发、数据库设计、前端框架应用以及移动跨平台开发。 首先,SpringBoot是Java领域广泛使用的微服务框架,它简化了Spring应用的初始搭建以及配置工作。SpringBoot...

    uniapp学习视频

    - A: 可以通过配置服务器端来解决跨域问题,或者在开发环境中使用代理服务器。 3. **Q: 如何提升应用性能?** - A: 可以通过代码分割、图片压缩、懒加载等方式来优化应用性能。 综上所述,UniApp作为一种高效的跨...

    C#非常好的技术网站

    - **移动应用开发**:使用Xamarin开发跨平台的移动应用。 ### 结论 通过上述内容,我们可以看出"C#非常好的技术网站"不仅提供了丰富的学习资源,还为开发者指明了发展方向。无论是初学者还是经验丰富的程序员,都...

    Ivelin Demirov Learn Javascript Visually

    - **跨平台**:无论是移动设备还是桌面浏览器,JavaScript都能良好地运行。这种跨平台的能力为开发者提供了极大的灵活性。 - **社区支持**:JavaScript拥有庞大的开发者社区和丰富的资源库。这为初学者提供了大量...

    web前端开发初学者的学习路线推荐.docx

    理解服务器端JavaScript的概念,搭建Express或Koa等框架,实现数据处理和API接口,从而具备全栈开发能力。 在学习过程中,选择一个优质的培训机构,如千锋教育,可以帮助你更高效地学习和掌握技能。他们的课程涵盖...

    uniapp封装的接口和已经引入uview的模板项目

    总结来说,"uniapp封装的接口和已经引入uview的模板项目"是一个集成了高效接口管理和优美UI设计的开发框架,旨在帮助开发者快速、高效地构建跨平台移动应用。通过深入理解和实践,开发者可以提升开发效率,同时保证...

Global site tag (gtag.js) - Google Analytics