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. cocos2d-x——在一个cpp中展示多个场景

    //20秒后自动运行下一个场景 runAction( CCSequence::create(CCDelayTime::create(20.0f), CCCallFunc::create(this, c ...

  2. android源码编译常见错误

    错误1:You are attempting to build on a 32-bit system. Only 64-bit build environments are supported bey ...

  3. 基于BaseHTTPServer的简单存储服务器

    服务器代码: from BaseHTTPServer import BaseHTTPRequestHandler from BaseHTTPServer import HTTPServer impor ...

  4. 双向BFS

    转自“Yuan” 如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个 ...

  5. Java汉字转成汉语拼音工具类

    Java汉字转成汉语拼音工具类,需要用到pinyin4j.jar包. import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...

  6. saltstack实战3--配置管理之grains

    grains是什么 grains是minion服务启动后,采集的客户端的一些基本信息,硬件信息,软件信息,网络信息,软件版本等.你可以在minion上自定义一些grains信息. 它是静态的信息,mi ...

  7. <转>cookie和缓存解析

    原文来自:http://www.cnblogs.com/cuihongyu3503319/archive/2008/04/18/1160083.html 缓存cache 为了提高访问网页的速度,浏览器 ...

  8. Git CMD - tag: Create, list, delete or verify a tag object signed with GPG

    命令格式 git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] <tagname> [& ...

  9. css尖角

    .market-nav-arrow { ; ; ; border-style: solid; border-width: 7px 0px 7px 7px; border-color: transpar ...

  10. update更新多行数据(oracle)

    转自:http://blog.itpub.net/25322446/viewspace-767505 说明:笔记总结了在工作中遇到过的几种update方法和各种方法适用的范围. 1.单表更新方案:使用 ...