java实时消息推送实现(java静态代理和动态代理)
本篇文章给大家谈谈java实时消息推送实现,以及java静态代理和动态代理对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
java服务器推送消息给android
几种常见的解决方案实现原理
1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。
3、消息推送解决方案概述
A、C2DM云端推送方案
在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android
Cloud to Device Messaging(C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
B、MQTT协议实现Android推送
采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
wmqtt.jar
是IBM提供的MQTT协议的实现。我们可以从这里()下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现()。
C、RSMB实现推送功能
Really Small Message Broker(RSMB)
,是一个简单的MQTT代理,同样由IBM提供,其查看地址是:。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。我们可以从这个地址下载它.
D、XMPP协议实现Android推送
Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:
1)
比如时间过长时,就再也收不到推送的信息了。
2)性能上也不够稳定。
3)如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
如果我们要使用androidpn,则还需要做大量的工作,需要理解XMPP协议、理解Androidpn的实现机制,需要调试内部存在的BUG。
如何实现socket信息推送
1.首先,了解socket的连接过程:
1)服务器监听;2)客户端请求;3)连接确认(具体详情可以见百度百科,我在这也就不多说了)。
2.socket通信机制:
服务器端
一、创建服务器套接字(CREATE)。
二、服务器套接字进行信息绑定(BIND),并开始监听连接(LISTEN)。
三、接受来自客户端的连接请求(ACCEPT),并创建接收进程。
四、开始数据传输(SEND、RECEIVE)。
五、关闭套接字(CLOSESOCKET)。
客户机端
一、创建客户机套接字(CREATE)。
二、与远程服务器进行连接(CONNECT),如被接受则创建接收进程。
三、开始数据传输(SEND、RECEIVE)。
四、关闭套接字(CLOSESOCKET)。
具体在Java中的实现是:
服务器端:
1)创建ServerSocket,需要使用端口号进行标识,以便客户端进行连接。
如:ServerSocket serverSocket= new ServerSocket(9999);
2)创建Socket获取连接
如: Socket socket= serverSocket.accept();
3)便可以进行通信内容传输了。
客户端:
1)创建Socket,进行与服务器连接,需要填写服务器ip,以及服务器的端口号
如:Socket socket= new Socket("127.0.0.1", 9999);
2)进行通信内容的传输。
以上只是一个简单的socket通信案例,想要了解的可以进入该链接下载:
3.利用socket通信进行服务器端到客户端的消息推送的思路:
客户端登录后发送一个消息给服务器端,用一个标识作为用户客户端程序关闭后服务器端是否推送消息给客户端,如果有则进行消息推送,如果没有则不进行消息推送,而当程序运行时就是一般的socket通信,也就是服务器端写一条消息推送给客户端,客户端便可以接收,并在消息栏上显示,点击消息栏进行相应的界面即可。
服务器就不多说了,方法是差不多的。
客户端:
需要使用Service来进行监听:
[java] view plain copy
print?
public class PushService extends Service{
private PushClient mClient;
private Handler mHandler;
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onCreate(){
super.onCreate();
initHandler();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
mClient= new PushClient(new InetSocketAddress("192.168.4.101", 9999),
mHandler);
mClient.start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){
if(mClient!= null){
mClient.disConnect();
}
super.onDestroy();
}
/**
*初始化Handler
*/
private void initHandler(){
mHandler= new Handler(new Callback(){
@Override
public boolean handleMessage(Message msg){
switch(msg.what){
case Const.PUSH_MSG:
String pushMsg= msg.obj.toString();
showNotification(pushMsg);
break;
default:
break;
}
return false;
}
});
}
/**
*
*在状态栏显示通知
*/
@SuppressWarnings("deprecation")
private void showNotification(String msg){
//创建一个NotificationManager的引用
NotificationManager notificationManager=(NotificationManager) getSystemService(android.content.Context.NOTIFICATION_SERVICE);
//定义Notification的各种属性
Notification notification= new Notification(R.drawable.ic_launcher,
msg, System.currentTimeMillis());
// FLAG_AUTO_CANCEL该通知能被状态栏的清除按钮给清除掉
// FLAG_NO_CLEAR该通知不能被状态栏的清除按钮给清除掉
// FLAG_ONGOING_EVENT通知放置在正在运行
// FLAG_INSISTENT是否一直进行,比如音乐一直播放,知道用户响应
notification.flags|= Notification.FLAG_AUTO_CANCEL;//表明在点击了通知栏中的"清除通知"后,此通知不清除,经常与FLAG_ONGOING_EVENT一起使用
// DEFAULT_ALL使用所有默认值,比如声音,震动,闪屏等等
// DEFAULT_LIGHTS使用默认闪光提示
// DEFAULT_SOUND使用默认提示声音
// DEFAULT_VIBRATE使用默认手机震动,需加上<uses-permission
// android:name="android.permission.VIBRATE"/>权限
notification.defaults= Notification.DEFAULT_SOUND;
//设置通知的事件消息
CharSequence contentTitle= msg;//通知栏标题
CharSequence contentText= msg;//通知栏内容
Intent notificationIntent= new Intent(this, TestActivity.class);//点击该通知后要跳转的Activity
PendingIntent contentItent= PendingIntent.getActivity(this, 0,
notificationIntent, 0);
notification.setLatestEventInfo(this, contentTitle, contentText,
contentItent);
//把Notification传递给NotificationManager
notificationManager.notify(0, notification);
}
这样就可以在将接收到的消息在消息栏上显示了,点击后便可以进入相应的界面了。
java框架如何实现移动应用程序的实时功能
在Java框架中实现移动应用程序的实时功能,通常需要结合WebSocket和STOMP协议来构建高效的消息推送机制。以下是详细的实现步骤和关键代码示例:
1.技术栈准备Java 8+:基础运行环境。Spring Boot 2.x:快速搭建后端服务。WebSocket:实现全双工通信。STOMP:简化消息协议,支持订阅/发布模式。2.实现步骤步骤1:创建Spring Boot应用在pom.xml中添加WebSocket依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>步骤2:配置STOMP端点创建配置类,启用WebSocket并注册STOMP端点:
@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer{@Override public void registerStompEndpoints(StompEndpointRegistry registry){//客户端连接的端点,支持SockJS(兼容旧浏览器) registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();}@Override public void configureMessageBroker(MessageBrokerRegistry registry){//配置消息代理,客户端订阅前缀为"/topic"的消息 registry.enableSimpleBroker("/topic");//服务端处理前缀为"/app"的消息 registry.setApplicationDestinationPrefixes("/app");}}步骤3:创建消息处理器通过@Controller处理客户端消息并广播:
@Controllerpublic class MessageController{@Autowired private SimpMessagingTemplate messagingTemplate;//客户端发送消息到"/app/chat"时触发@MessageMapping("/chat")@SendTo("/topic/messages")//广播到订阅"/topic/messages"的客户端 public Message handleMessage(Message message){ return message;//返回的消息会自动广播}//主动推送消息(如通知) public void sendNotification(String content){ messagingTemplate.convertAndSend("/topic/notifications", new Notification(content));}}步骤4:客户端实现(JavaScript示例)使用SockJS和STOMP.js连接服务端:
const socket= new SockJS('/ws');const stompClient= Stomp.over(socket);stompClient.connect({}, function(frame){ console.log('Connected:'+ frame);//订阅消息 stompClient.subscribe('/topic/messages', function(message){ console.log('Received:'+ JSON.parse(message.body).content);});//发送消息 stompClient.send("/app/chat",{}, JSON.stringify({'content':'Hello!'}));});步骤5:移动端集成Android:使用Java-WebSocket库或Socket.IO客户端。iOS:通过Starscream或原生URLSessionWebSocketTask。3.关键点说明STOMP协议:将WebSocket通信抽象为SUBSCRIBE、SEND等命令,简化开发。消息代理:SimpleBroker适合小型应用,生产环境可替换为RabbitMQ/ActiveMQ。安全性:通过@MessageExceptionHandler处理异常,或添加Spring Security认证。4.完整流程示例客户端订阅:连接/ws端点并订阅/topic/messages。消息发送:客户端发送消息到/app/chat,服务端处理后广播。主动推送:服务端通过SimpMessagingTemplate随时推送通知。5.优化建议心跳检测:配置stompClient.heartbeat.outgoing保持长连接。离线消息:结合数据库存储未读消息,客户端重连后同步。性能调优:调整WebSocket线程池大小(spring.websocket.message-buffer-size)。通过以上步骤,Java框架(如Spring Boot)可高效实现移动应用的实时功能,适用于聊天、实时数据更新等场景。
关于java实时消息推送实现,java静态代理和动态代理的介绍到此结束,希望对大家有所帮助。