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应用开发中,由于众所周知的原 ...
随机推荐
- android开发之路09(浅谈SQLite数据库01)
1.SQLite数据库: SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使 用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同, ...
- 移动终端学习2:触屏原生js事件及重力感应
如今智能移动设备已经渗透到人们生活的方方面面,用户数量也在不断迅速增长(市场研究机构 eMarketer 在今年初发表的趋势报告中预测,2014年至2018年,中国智能手机用户从总人口的 38.3%增 ...
- SQL Server blocking session
select * from sys.sysprocesses where blocked>0; 96被95block住了. dbcc INPUTBUFFER(95) dbcc INPUTBUFF ...
- ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。
二维码介绍: 二维码(QR(Quick Response)code),又称二维条码,最早起源于日本. 它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息 ...
- 最简单的Linux-ACL操作
添加ACL setfacl -m u:'username':rw 'dir or file' "-R可以迭代式的给目录下所有文件都添加相同的ACL" 查看ACL规则 getfa ...
- VS中的波浪线
绿色波浪线: 如果你的代码中出现了绿色的波浪线,说明你的代码语法并没有错误, 只不过提示你有可能会出现错误,但是不一定会出现错误.警告线 红色波浪线: 如果你的代码中出现了红色的波浪线,意味着你的代码 ...
- Java I/O第二篇 之 (缓冲流 随机流 数组流 数据流)
1:缓冲流 BufferedReader BufferedWriter 具有较强的读写能力,能单独读写一行数据,能够减少对硬盘的访问次数. /** * 缓冲流 能够增强对问价数据的可读性,减少访问读 ...
- jquery---helloworld
style.css
- Mysql增加主键或者更改表的列为主键的sql语句
...
- C# 添加,修改,删除文件夹/文件集合
C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt"); sw ...