android websocket推送
1、通过WebSocketServlet来实现
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.nio.ByteBuffer;
- import java.nio.CharBuffer;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Set;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.catalina.websocket.MessageInbound;
- import org.apache.catalina.websocket.StreamInbound;
- import org.apache.catalina.websocket.WebSocketServlet;
- import org.apache.catalina.websocket.WsOutbound;
- public class ChatWebSocketServlet extends WebSocketServlet {
- /**
- *
- */
- private static final long serialVersionUID = 911879078000755859L;
- //private final Map<Integer, WsOutbound> map = new HashMap<Integer, WsOutbound>();
- private final Map<String,WsOutbound> users = new HashMap<String,WsOutbound>();
- @Override
- protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request)
- {
- String username = null;
- try {
- username = request.getParameter("username");
- System.out.println(username);
- if(username != null){
- username = new String(username.getBytes("ISO8859_1"),"UTF-8");
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(username+" 请求连接:");
- return new ChatMessageInbound(username);
- }
- class ChatMessageInbound extends MessageInbound {
- private String userName = "user";
- public ChatMessageInbound(String userName) {
- this.userName = userName;
- }
- @Override
- protected void onOpen(WsOutbound outbound) {
- users.put(userName, outbound);
- System.out.println(userName+"上线了,总共"+users.size()+"人在线");
- super.onOpen(outbound);
- }
- @Override
- protected void onClose(int status) {
- users.remove(userName);
- System.out.println("下线:"+userName);
- super.onClose(status);
- }
- @Override
- protected void onBinaryMessage(ByteBuffer buffer) throws IOException {
- // TODO Auto-generated method stub
- }
- @Override
- protected void onTextMessage(CharBuffer buffer) throws IOException {
- String msg = buffer.toString();
- System.out.println(userName+":"+msg);
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
- msg = userName+" " + sdf.format(date)+":\n" + msg;
- broadcast(msg);
- }
- private void broadcast(String msg) {
- Set<String> set = users.keySet();
- for (String name : set)
- {
- WsOutbound outbound = users.get(name);
- CharBuffer buffer = CharBuffer.wrap(msg);
- try {
- outbound.writeTextMessage(buffer);
- outbound.flush();
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println(name+"----");
- }
- }
- }
- }
2、通过@ServerEndpoint注解
- import java.io.IOException;
- import java.util.Set;
- import java.util.concurrent.CopyOnWriteArraySet;
- import javax.websocket.OnClose;
- import javax.websocket.OnError;
- import javax.websocket.OnMessage;
- import javax.websocket.OnOpen;
- import javax.websocket.Session;
- import javax.websocket.server.PathParam;
- import javax.websocket.server.ServerEndpoint;
- @ServerEndpoint(value = "/ws/chat/{nickName}")
- public class Chat {
- /**
- * 连接对象集合
- */
- private static final Set<Chat> connections = new CopyOnWriteArraySet<Chat>();
- private String nickName;
- /**
- * WebSocket Session
- */
- private Session session;
- public Chat() {
- }
- /**
- * 打开连接
- *
- * @param session
- * @param nickName
- */
- @OnOpen
- public void onOpen(Session session,
- @PathParam(value = "nickName") String nickName) {
- this.session = session;
- this.nickName = nickName;
- connections.add(this);
- String message = String.format("System> %s %s", this.nickName,
- " has joined.");
- Chat.broadCast(message);
- System.out.println(message);
- }
- /**
- * 关闭连接
- */
- @OnClose
- public void onClose() {
- connections.remove(this);
- String message = String.format("System> %s, %s", this.nickName,
- " has disconnection.");
- Chat.broadCast(message);
- System.out.println(message);
- }
- /**
- * 接收信息
- *
- * @param message
- * @param nickName
- */
- @OnMessage
- public void onMessage(String message,
- @PathParam(value = "nickName") String nickName) {
- Chat.broadCast(nickName + ">" + message);
- System.out.println(message);
- }
- /**
- * 错误信息响应
- *
- * @param throwable
- */
- @OnError
- public void onError(Throwable throwable) {
- System.out.println(throwable.getMessage());
- }
- /**
- * 发送或广播信息
- *
- * @param message
- */
- private static void broadCast(String message) {
- for (Chat chat : connections) {
- try {
- synchronized (chat) {
- chat.session.getBasicRemote().sendText(message);
- }
- } catch (IOException e) {
- connections.remove(chat);
- try {
- chat.session.close();
- } catch (IOException e1) {
- }
- Chat.broadCast(String.format("System> %s %s", chat.nickName,
- " has bean disconnection."));
- System.out.println(String.format("System> %s %s", chat.nickName,
- " has bean disconnection."));
- }
- }
- }
- }
3、android
- package com.example.test;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.EditText;
- import android.widget.Toast;
- import de.tavendo.autobahn.WebSocketConnection;
- import de.tavendo.autobahn.WebSocketConnectionHandler;
- import de.tavendo.autobahn.WebSocketException;
- public class MainActivity extends Activity {
- final WebSocketConnection wsc = new WebSocketConnection();
- private EditText edt;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- edt = (EditText) findViewById(R.id.edt1);
- findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (wsc.isConnected()) {
- wsc.sendTextMessage(edt.getText().toString());
- } else {
- Toast.makeText(getApplicationContext(), "请先加入",
- Toast.LENGTH_SHORT).show();
- }
- }
- });
- // System.out.println("websocket///");
- findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- //"ws://192.168.1.106:9090/websocket01/chat.ws?username=server11"
- String url = "ws://192.168.1.106:8080/websocket01/ws/chat/server11";
- wsc.connect(url,
- new WebSocketConnectionHandler() {
- @Override
- public void onBinaryMessage(byte[] payload) {
- System.out.println("onBinaryMessage size="
- + payload.length);
- }
- @Override
- public void onClose(int code, String reason) {
- System.out.println("onClose reason="
- + reason);
- }
- @Override
- public void onOpen() {
- System.out.println("onOpen");
- wsc.sendTextMessage("Hello!");
- // wsc.disconnect();
- }
- @Override
- public void onRawTextMessage(byte[] payload) {
- System.out.println("onRawTextMessage size="
- + payload.length);
- }
- @Override
- public void onTextMessage(String payload) {
- System.out.println("onTextMessage"
- + payload);
- edt.setText(payload);
- }
- });
- } catch (WebSocketException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- });
- }
- @Override
- protected void onStop() {
- wsc.disconnect();
- super.onStop();
- }
- }
来自网络,稍加修改。
android websocket推送的更多相关文章
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- Android消息推送怎么实现?
在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...
- android 消息推送
android 消息推送 极光推送百度云推送(语音)友盟消息推送
- Android消息推送——JPush极光推送
刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...
- 【原】android本地推送
android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...
- Android实现推送方式解决方案(转)
本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...
- 【android极光推送】—从客户端到后台,一文通吃
sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...
- Android消息推送完美方案[转]
转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...
- Android消息推送完美方案
转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...
随机推荐
- NODE编程(三)--构建Node Web程序1
一.HTTP服务器的基本知识 1.Node如何向开发者呈现HTTP请求 Node中的http模块提供了HTTP服务器和客户端接口: var http = require('http'); 创建HTTP ...
- [转]Using Replacement Strings with Regex.Replace
本文转自:http://www.knowdotnet.com/articles/regereplacementstrings.html The String.Replace function has ...
- 伸展树 Splay Tree
Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- Git CMD - rm: Remove files from the working tree and from the index
命令格式 git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>… 命令参 ...
- oracle数据库创建表空间和表临时空间
1:创建临时表空间 create temporary tablespace user_temp tempfile 'Q:\oracle\product\10.2.0\oradata\Test\xyrj ...
- JavaScript之模拟评星打分
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...
- JSP之session
index.jsp: <form id="form1" name="form1" method="post" action=" ...
- Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...
- 第四十六篇、UICollectionView广告轮播控件
这是利用人的视觉错觉来实现无限轮播,UICollectionView 有很好的重用机制,这只是部分核心代码,后期还要继续完善和代码重构. #import <UIKit/UIKit.h> # ...