博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android websocket推送
阅读量:7072 次
发布时间:2019-06-28

本文共 9369 字,大约阅读时间需要 31 分钟。

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
map = new HashMap
(); private final Map
users = new HashMap
(); @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
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
connections = new CopyOnWriteArraySet
(); 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();    }}

来自网络,稍加修改。

 

 

转载于:https://www.cnblogs.com/jiduoduo/p/5116601.html

你可能感兴趣的文章
redis去重方案
查看>>
内连接和外连接
查看>>
RT-Thread--内核基础
查看>>
PC键盘在Mac下Command/Option键切换
查看>>
数字签名和验签的详细过程
查看>>
漫谈《信号与系统》
查看>>
POJ 1742 Coins(多重背包,优化)
查看>>
内容不随模态框滚动
查看>>
Flume+Kafka+SparkStreaming+Hbase+可视化(二)
查看>>
C语言中的结构体
查看>>
文本框只能输入数字
查看>>
netty实现TCP长连接
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(17)——思考2
查看>>
在Mysql中怎样返回一个数据库的所有表名,列名数据类型备注
查看>>
[转载] 信息系统项目管理师视频教程——12 项目整体管理
查看>>
XAML实例教程系列 - 类型转换器(Type Converter)
查看>>
LeetCode 50. Pow(x, n)
查看>>
Action的创建和配置
查看>>
checkAll全选的一个小例子
查看>>
【转】centos关机与重启命令详解
查看>>