websocket实现android消息推送

java_webSocket实现android消息推送 背景公司的项目是直播相关,很自然的就会有直播间以及聊天的功能,和不少直播一样,我们也选择了环信,环信的接入和使用相对来说挺方便的,但是随着直播间人数的增多,出现了一个很严重的问题,我们称之为异次元,进入直播间看不到别人的互动,自己玩的不亦乐乎,别人也看不到…考虑到问题的严重性,我们决定换一种方式:webSocket.webSocket简介因为是做直播中即时通讯,因此消息的发送将会非常频繁,如果采取h 阅读详情
    前段时间做一个项目,需要android客户端作为管理工具与web服务器后台实时交互,想了很多方法,包括androidpn、openfire+smack、xmpp协议,要么太繁琐,要么无法满足实时性。想来还是用socket,经人提醒想到了websocket。

    websocket协议是近些年随html5发展而诞生的,主要用于解决web服务器与客户端无法双向交互的问题。如今已经被W3C收入标准协议。
    服务器支持:tomcat、jetty的最新版本都已支持websocket;如果不想更换现有服务器,也可用spring4.0作为替代。据说新版本的jre将收入websocket类,没具体接触。
    客户端支持:目前的主流浏览器都已经实现了websocket,但由于前期协议版本变化太快,很多厂商没有跟上。android默认浏览器就不支持websocket,IE也直到IE10才支持。
    网上已有通过html实现websocket client的例子,这里我们用java实现客户端连接。废话不说,上Demo:

1.服务器端
服务器用了tomcat 7.0,直接使用tomcat的websocket实现
1)连接管理类
[java]  view plain  copy
  1. import java.io.IOException;  
  2. import java.nio.CharBuffer;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.apache.catalina.websocket.MessageInbound;  
  6. import org.apache.catalina.websocket.WsOutbound;  
  7.   
  8. public class MessageCenter  
  9. {  
  10.     private static MessageCenter        instance           = new MessageCenter();  
  11.   
  12.     private List<MessageInbound>        socketList;  
  13.   
  14.     private MessageCenter()  
  15.     {  
  16.         this.socketList = new ArrayList<MessageInbound>();  
  17.     }  
  18.   
  19.     public static MessageCenter getInstance()  
  20.     {  
  21.         return instance;  
  22.     }  
  23.   
  24.     public void addMessageInbound(MessageInbound inbound)  
  25.     {  
  26.         socketList.add(inbound);  
  27.     }  
  28.   
  29.     public void removeMessageInbound(MessageInbound inbound)  
  30.     {  
  31.         socketList.remove(inbound);  
  32.     }  
  33.   
  34.     public void broadcast(CharBuffer msg) throws IOException  
  35.     {  
  36.         for (MessageInbound messageInbound : socketList)  
  37.         {  
  38.             CharBuffer buffer = CharBuffer.wrap(msg);  
  39.             WsOutbound outbound = messageInbound.getWsOutbound();  
  40.             outbound.writeTextMessage(CharBuffer.wrap("broadcasting:" + msg));  
  41.             // outbound.writeTextMessage(buffer);  
  42.             outbound.flush();  
  43.         }  
  44.     }  
  45. }  

2)消息入口类
[java]  view plain  copy
  1. import java.io.IOException;  
  2. import java.nio.ByteBuffer;  
  3. import java.nio.CharBuffer;  
  4. import java.util.Date;  
  5.   
  6. import org.apache.catalina.websocket.MessageInbound;  
  7. import org.apache.catalina.websocket.WsOutbound;  
  8.   
  9. public class MyMessageInbound extends MessageInbound {  
  10.   
  11.     @Override  
  12.     protected void onBinaryMessage(ByteBuffer arg0) throws IOException {  
  13.         // TODO Auto-generated method stub  
  14.           
  15.     }  
  16.   
  17.     @Override  
  18.     protected void onTextMessage(CharBuffer msg) throws IOException {  
  19.         System.out.println("Received:"+msg);  
  20.         MessageCenter.getInstance().broadcast(msg);  
  21.           
  22.     }  
  23.   
  24.     @Override  
  25.     protected void onClose(int status) {  
  26.         System.out.println("close:"+new Date());  
  27.         MessageCenter.getInstance().removeMessageInbound(this);  
  28.         super.onClose(status);  
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onOpen(WsOutbound outbound) {  
  33.         System.out.println("open :"+new Date());  
  34.         super.onOpen(outbound);  
  35.         MessageCenter.getInstance().addMessageInbound(this);  
  36.     }  
  37. }  

3)Websocket servlet
[java]  view plain  copy
  1. import javax.servlet.http.HttpServletRequest;  
  2.   
  3. import org.apache.catalina.websocket.StreamInbound;  
  4. import org.apache.catalina.websocket.WebSocketServlet;  
  5.   
  6. public class MeWebSocketServlet extends WebSocketServlet  
  7. {  
  8.   
  9.     private static final long serialVersionUID = -7178893327801338294L;  
  10.   
  11.     @Override  
  12.     protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request)  
  13.     {  
  14.         System.out.println("##########client login#########");  
  15.         return new MyMessageInbound();  
  16.     }  
  17.   
  18. }  

4)添加servlet到web.xml
[html]  view plain  copy
  1. < servlet>  
  2.        < servlet-name> android</ servlet-name >  
  3.        < servlet-class> MyWebSocketServlet </servlet-class >  
  4. </ servlet>  
  5. < servlet-mapping>  
  6.        < servlet-name> android</ servlet-name >  
  7.        < url-pattern> *.do</ url-pattern >  
  8. </ servlet-mapping>  
2.客户端
    客户端使用java实现websocket client,
    网上有人实现了Java-websocket: https://github.com/TooTallNate/Java-WebSocket  可以取得源码,用maven编译。
    最新jar包下载地址:

    引用jar包后,实现简单消息连接:
[java]  view plain  copy
  1. import java.net.URI;  
  2. import java.net.URISyntaxException;  
  3.   
  4. import org.java_websocket.client.WebSocketClient;  
  5. import org.java_websocket.drafts.Draft;  
  6. import org.java_websocket.drafts.Draft_10;  
  7. import org.java_websocket.drafts.Draft_17;  
  8. import org.java_websocket.framing.Framedata;  
  9. import org.java_websocket.handshake.ServerHandshake;  
  10.   
  11. /** This example demonstrates how to create a websocket connection to a server. Only the most important callbacks are overloaded. */  
  12. public class ExampleClient extends WebSocketClient {  
  13.   
  14.         public ExampleClient( URI serverUri , Draft draft ) {  
  15.                 super( serverUri, draft );  
  16.         }  
  17.   
  18.         public ExampleClient( URI serverURI ) {  
  19.                 super( serverURI );  
  20.         }  
  21.   
  22.         @Override  
  23.         public void onOpen( ServerHandshake handshakedata ) {  
  24.                 System.out.println( "opened connection" );  
  25.                 // if you plan to refuse connection based on ip or httpfields overload: onWebsocketHandshakeReceivedAsClient  
  26.         }  
  27.   
  28.         @Override  
  29.         public void onMessage( String message ) {  
  30.                 System.out.println( "received: " + message );  
  31.         }  
  32.   
  33.         @Override  
  34.         public void onFragment( Framedata fragment ) {  
  35.                 System.out.println( "received fragment: " + new String( fragment.getPayloadData().array() ) );  
  36.         }  
  37.   
  38.         @Override  
  39.         public void onClose( int code, String reason, boolean remote ) {  
  40.                 // The codecodes are documented in class org.java_websocket.framing.CloseFrame  
  41.                 System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) );  
  42.         }  
  43.   
  44.         @Override  
  45.         public void onError( Exception ex ) {  
  46.                 ex.printStackTrace();  
  47.                 // if the error is fatal then onClose will be called additionally  
  48.         }  
  49.   
  50.         public static void main( String[] args ) throws URISyntaxException {  
  51.                 ExampleClient c = new ExampleClient( new URI( "ws://localhost:8080/myweb/android.do" ), new Draft_17() );   
  52.                 c.connectBlocking();  
  53.                 c.send("handshake");  
  54.         }  
  55. }  
注意,连接中使用的new Draft_17()就是使用的协议version 17( RFC 6455),Tomcat 7.0使用的协议版本为RFC 6455。
总结websocket的利弊
优点:
与socket相比,可以节省额外的端口占用,直接使用一个公网域名访问。另外协议对报文的流量消耗做了优化。
缺点:
毕竟websocket底层也是socket连接,因而当大并发用户连接时目测会消耗较多资源。
参考:

使用WebSocket实现Android消息推送 在上述代码中,我们继承了WebSocketClient类,并重写了其中的几个方法。在onMessage方法中,可以处理收到的服务器推送消息;在onError方法中,可以处理连接过程中发生的错误。在Android应用中使用WebSocket可以实现消息推送功能,使得应用能够接收实时的推送消息,提升用户体验。在上述代码中,我们创建了一个WebSocketClient对象,并传入服务器的URL。最后,当我们不再需要连接时,可以调用WebSocketClient对象的close()方法来断开连接并释放资源。 阅读详情

相关推荐

基于WebSocket的Android消息推送系统设计与实现

优势点描述统一网络栈与 App 中已有的 HTTP 请求共享同一个实例,降低内存开销连接复用复用 TCP 连接,提升握手效率,尤其适用于混合 REST + WebSocket 架构拦截器支持可插入日志、鉴权、压缩等拦截器,增强调试与安全性自动线程切换所有回调均运行在后台线程,UI 更新需手动切回主线程流式写入支持支持异步发送大体积数据流(通过send()方法)

weixin_34945060的博客 1115

websocket之安卓

最近做这个功能,分享一下。即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易实现。但是如果项目有特殊要求(如不能使用外网),那就得自己做了,所以我们需要使用WebSocket。 WebSocket WebSocket协议就不细讲了,感兴趣的可以具体查阅资料,简而言之,它就...

u011100532的博客 4263

AOSP14 Launcher3——手势上滑关键类AbsSwipeHandler解析

通过精密的事件监听、状态管理和对系统动画 API 及 Launcher 内部组件的协调,实现了复杂而流畅的手势导航体验。它的抽象设计允许子类(如。是 Quickstep (Launcher3 的手势导航实现) 中处理。的核心逻辑抽象基类。这个非常核心且复杂的类。)定制特定的回家动画逻辑。好的,我们来深入分析。

Micheal_Yang's Blog 1519

WebSocket 安卓客户端实现及代码封装

介绍 关于 WebSocket Android 端的使用封装之前已经做过一次了,但在使用了一段时间之后逐渐发现了一些问题,一直想改也没时间,正好最近公司业务比较少,就趁着这段时间有空闲把代码优化了一下,其实差不多是重新做一套了。 这个版本的使用方式上比之前简化了很多,集成起来也更容易,并且代码逻辑更加清晰,模块与模块之间的耦合降到最低,运行效率更高,更健壮,好了废话不说了,先介绍一下使用方式。...

张可的博客 1万+

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

51单片机AHT20-21源代码

传感器输出经过 标定的数字信号,标准 I 2 C 格式。AHT20 配有一个全新设计的 ASIC专用芯片、一 个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其 性能已经大大提升甚至超出了前一代传感器的可靠性水平,新一代温湿度传感器, 经过改进使其在恶劣环境下的性能更稳定。但是现在网上的大多数原码都是针对stm32等的这种多位单片机,而我们都知道51单片机是8位单片机,无法对浮点数进行运算,对32位的整数计算有时候也不是很准确,所以我对网上stm32的例程进行了修改。...

wd0710的博客 4545

基于WebSocket和Android的多人实时聊天系统(Demo)的实现

基于WebSocket和Android的多人实时聊天系统(Demo)的实现

sakura的博客 1623

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

WebSocket实现android消息推送

WebSocket实现android消息推送WebSocket是HTML5出的协议,基于TCP。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket协议之前,双工通信是通过多个http链接来实现,这导致了效率低下。WebSocket解决了这个问题。有了websocket协议,服务器就可以主动给客户端发送消息,而不是要等客户端的轮询。实现一个

Halfopen的专栏 5600

JLink 添加国产芯片手把手教程(雅特力 + 华大)

拷贝厂商算法文件夹 + 配置 JLinkDevices.xml。雅特力直接复制官方配置,华大按需添加芯片节点,操作一次,永久生效,以后调试 AT32、HC32 再也不用愁找不到型号。这套方法适配全版本 JLink,也是国产 MCU 替代项目的必备技能,看完照着做,新手也能轻松搞定。百度网盘资料分享:通过网盘分享的文件:jink驱动(包括新增芯片型号)链接: https://pan.baidu.com/s/14SLgrPfyof1lglD6VQguAw?pwd=cfuq 提取码: cfuq。

weixin_48867130的博客 707

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1455

linux 安卓 推送通知,WebSocket实现Android消息推送

前段时间做一个项目,需要Android客户端作为管理工具与web服务器后台实时交互,想了很多方法,包括androidpn、openfire+smack、xmpp协议,要么太繁琐,要么无法满足实时性。想来还是用socket,经人提醒想到了websocket。websocket协议是近些年随html5发展而诞生的,主要用于解决web服务器与客户端无法双向交互的问题。如今已经被W3C收入标准协议。服务器...

weixin_27966471的博客 316

AUTOSAE软件配置-项目标准配置 (PSC) 导入达芬奇( DaVinci Configurator)

文件是“可拆分的”,这意味着如果格式符合 AUTOSAR 拆分规则,则可以与其他。)是一个ARXML文件,主要由OEM提供,其中包含。)工件,可以作为输入文件导入到达芬奇配置器专业版。导入的参数将以只读方式处理。不允许在多个 ARXML 文件中导入一个。的已存在数据或从输入文件派生的数据。可以作为输入文件导入到另一个。文件会覆盖用户配置的基本。元素和诊断数据预配置。定义 [数据结构]。中,可以导出一个或多个。

m0_49148264的博客 1003

websocket 步骤 消息推送_WebSocket实现android消息推送

WebSocket实现android消息推送WebSocket是HTML5出的协议,基于TCP。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket协议之前,双工通信是通过多个http链接来实现,这导致了效率低下。WebSocket解决了这个问题。有了websocket协议,服务器就可以主动给客户端发送消息,而不是要等客户端的轮询。实现一...

weixin_34766614的博客 518

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1984

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java android 消息推送_Android中使用WebSocket实现群聊和消息推送功能(不使用WebView)...

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能。更多知识参考:如何理解 TCP/IP, SPDY, WebSocket 三者之间的关系?...

weixin_35953861的博客 466

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android仿微信WebSocket实现:高并发消息推送的架构优化实践

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960048的博客 279

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android利用WebSocket实现消息推送

1、webSocket服务端的配置与代码: (1)、服务器端工程目录结构: (2)、web.xml的配置 1 2 3 4 5 6 7 webSocketServlet        class>com.cn.controller.WebSocketServletServiceclass>  

It_BeeCoder的博客 3764

利用websocket实现android消息推送

前段时间做一个项目,需要android客户端作为管理工具与web服务器后台实时交互,想了很多方法,包括androidpn、openfire+smack、xmpp协议,要么太繁琐,要么无法满足实时性。想来还是用socket,经人提醒想到了websocket。     websocket协议是近些年随html5发展而诞生的,主要用于解决web服务器与客户端无法双向交互的问题。如今已经

火侬智能科技 1251

android推送服务端代码,android利用WebSocket实现消息推送

1、webSocket服务端的配置与代码:(1)、服务器端工程目录结构:(2)、web.xml的配置webSocketServletcom.cn.controller.WebSocketServletServicewebSocketServlet/webSocketServlet(3)、服务端代码public class WebSocketServletService extends WebSoc...

weixin_32672471的博客 494

使用GoEasy快速实现Android原生app中的websocket消息推送

GoEasy带来了一项令开发者振奋的消息:全面支持Android原生平台!现在,您可以在Android应用中使用最酷炫的实时通信功能,借助GoEasy轻松实现消息的发送和接收。本文将带您领略GoEasy最新版本的威力,为您的应用增添一抹鲜活的互动色彩。

GoEasy Websocket消息推送 641
上一篇: Android WebSocket实现即时通讯/推送
下一篇: WebSocket实现Android客户端之间的简单通讯
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值