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推送的更多相关文章

  1. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  2. Android消息推送怎么实现?

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  3. android 消息推送

    android 消息推送 极光推送百度云推送(语音)友盟消息推送

  4. Android消息推送——JPush极光推送

    刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...

  5. 【原】android本地推送

    android本地推送的实现原理:开启一个BroadcastReceiver和一个AlarmManager,闹钟设置推送唤醒时间,BroadcastReceiver一直在检测是否应该推送. 目前遗留问 ...

  6. Android实现推送方式解决方案(转)

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

  7. 【android极光推送】—从客户端到后台,一文通吃

    sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...

  8. Android消息推送完美方案[转]

    转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...

  9. Android消息推送完美方案

    转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...

随机推荐

  1. centos搭建本地库

    --2013年8月23日11:00:26环境:centos6.3(64bit)--场景默认情况下在用yum install 安装软件会从配置库中下载依赖包默认依赖库:来自网络在本地搭建依赖库可以节约带 ...

  2. 关于JDK中采用单例模式的类

    JDK设计模式应用——单例模式(Singleton) <JDK源码分析>的分支,讲解设计模式在jdk中使用. 我们从三个方面讲述,一是:jdk源码中的设计模式:二是:讲解设计模式(UML图 ...

  3. 关于css雪碧图sprite

    天气转凉了,又开始贪恋暖暖的被窝了. 早上不想起床的时候在被窝里看了有关于雪碧图的视频. 1.使用场景 V导航条,登录框img标签多次载入,性能低 X大图banner按需加载,如果做成雪碧图一次加载就 ...

  4. Spring(3.2.3) - Beans(10): 生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...

  5. Spring(3.2.3) - Beans(12): 属性占位符

    使用属性占位符可以将 Spring 配置文件中的部分元数据放在属性文件中设置,这样可以将相似的配置(如 JDBC 的参数配置)放在特定的属性文件中,如果只需要修改这部分配置,则无需修改 Spring ...

  6. JDBC之数据连接

    :数据库语句: create database LandDB; use LandDB; create table T_BL_CANTON_CODE ( CTN_CODE int primary key ...

  7. iOS学习——iOS视频和推荐网站

    最近有人问有没有iOS学习的相关资料,就简单的把自己的知道的和资源共享一下: 个人感觉iOS开发人才饱和,培训泛滥,个人推荐后台升职空间大和web前端竞争小. [链接][Ronda收集整理]2014年 ...

  8. (转)一些国外优秀的elasticsearch使用案例

    Github “Github使用Elasticsearch搜索20TB的数据,包括13亿的文件和1300亿行的代码” 这个不用介绍了吧,码农们都懂的,Github在2013年1月升级了他们的代码搜索, ...

  9. SEO前端优化

    精减代码 清除网页中一些冗余的代码,网上有这样的工具,可以辅助完成,如果需要的话,我们可以把代码中的注释去掉,甚至空行之类的也去掉,尽量的减少代码量,从而减小页面体积. CSS Sprites 通俗点 ...

  10. Shared library can't open object

    将cpp的源文件和.so (shared object)链接成可执行程序之后,无法运行,提示如标题,实际就是找不到共享库. 最终找到了解决办法是: export LD_LIBRARY=./:$LD_L ...