用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

websocket

2017-08-23 作者: cjh举报

[java]代码库

package com.smartAnji.control.utils;

import java.io.IOException;

/**
 * WebSocketService
 */
@ServerEndpoint(value = "/websocket", configurator = GetHttpSessionConfigurator.class)
public class WebSocketService {

    // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    private static CopyOnWriteArraySet<WebSocketService> webSocketSet = new CopyOnWriteArraySet<WebSocketService>();

    // websocket自带了session,与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    private HttpSession httpSession; // HttpSession协议,jsp的session

    // 通信流程 : pageName(httpsession) <--> session(webSocketSet)

    private String pageName; // 用户名(网页名)

    private static List<String> pageList = new ArrayList<String>(); // 在线用户列表(静态)

    // pageName和session绑定的路由表,由pageName找到相应的session
    private static Map<String, Session> onlineUsers = new HashMap<String, Session>();

    /**
     * 连接建立成功调用的方法
     * 
     * @param session
     *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     * @throws IOException
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) throws IOException {

        this.session = session;
        this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        this.pageName = (String) this.httpSession.getAttribute("user"); // 获取当前用户

        if (pageName != null) {
            onlineUsers.put(pageName, this.session);
            pageList.add(pageName); // 加入pagelist中
            webSocketSet.add(this); // 加入webSocketSet中
            System.out.println(pageName + " ----> 新连接加入!当前在线人数为 " + pageList.size());
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        if (onlineUsers.containsKey(pageName)) {

            webSocketSet.remove(this); // 从set中删除
            pageList.remove(pageName); // 从在线列表移除这个用户
            onlineUsers.remove(pageName); // 从路由表删除

            System.out.println(pageName + "移除成功");
            System.out.println(pageName + "关闭!当前在线人数为" + pageList.size());
        }
    }

    /**
     * 发生错误时调用
     * 
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 收到客户端消息后调用的方法
     * 
     * @param message
     *            客户端发出的消息
     * @throws IOException
     */
    @OnMessage
    public void onMessage(String message) throws IOException {

        HashMap<String, String> messageMap = MessageUtil.getMessage(message); // 处理消息类
        String fromName = messageMap.get("fromName"); // 消息来自人 的userId
        String toName = messageMap.get("toName"); // 消息发往人的 userId
        String mapContent = messageMap.get("content");
        String type = messageMap.get("type");

        if (MessageUtil.MESSAGE.equals(type)) {
            if ("all".equals(toName)) {
                String content = MessageUtil.sendContent(MessageUtil.MESSAGE, mapContent);
System.out.println("++++++++++++++++++++"+content);
                broadcastAll(content);
            } else {
                try {
                    singleChat(fromName, toName, mapContent);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 广播消息的方法
     * 
     * @param message
     * @throws IOException
     */
    private static void broadcastAll(String message) throws IOException {
        // 群发消息
        for (WebSocketService item : webSocketSet) {
            try {
                item.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    /**
     * 对特定用户发送消息的方法
     * 
     * @param fromName
     * @param toName
     * @param mapContent
     * @throws IOException
     */
    private void singleChat(String fromName, String toName, String mapContent) throws IOException {

        String contentTemp = MessageUtil.sendContent(MessageUtil.MESSAGE, mapContent);

        for (String pageName : pageList) {
            if ("navPage".equals(pageName) || "overPage".equals(pageName)) {
                session = onlineUsers.get(pageName);
                session.getBasicRemote().sendText(contentTemp);
            } else {
                System.out.println("客户端未打开!");
            }
        }

        // if (pageList.contains(toName)) {
        // session = onlineUsers.get(toName);
        // session.getBasicRemote().sendText(contentTemp);
        // } else {
        // System.out.println("客户端未打开!");
        // }

    }
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...