websocket-demo

 

package com.service.im;


import com.util.JsonHelper;
import com.vo.im.MsgVO;
import org.slf4j.LoggerFactory;

import javax.websocket.EncodeException;
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;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@ServerEndpoint(value = "/imWebSocket/{user}",
        decoders = {ServerDecoder.class},
        encoders = {ServerEncoder.class})
public class ImService {

    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ImService.class);


    private static ConcurrentHashMap<String, Session> customerMap = new ConcurrentHashMap();

    private String user;


    @OnMessage
    public void onMessage(MsgVO message, Session session)
            throws IOException, InterruptedException, EncodeException {

        logger.info("current user need to send msg : " + message);

        sendMsg(message);
    }



    private void sendMsg(MsgVO source) throws IOException, EncodeException {
        Session session = customerMap.get(source.getReceivedUser());

        if (session != null) {
            MsgVO msgVO = new MsgVO();
            msgVO.setCurrentUser(this.user);
            msgVO.setType("MSG");
            msgVO.setReceivedUser(source.getReceivedUser());
            msgVO.setCode("0");
            msgVO.setMessage(source.getMessage());
            logger.info("current user begin to send msg : " + JsonHelper.toJson(msgVO));

            session.getBasicRemote().sendObject(msgVO);
        }

    }


    @OnOpen
    public void onOpen(@PathParam("user") String user, Session session) {
        logger.info("Client connected");

        this.user = user;
        customerMap.put(user, session);
    }

    @OnClose
    public void onClose(@PathParam("user") String user) {
        logger.info("Connection closed");

        customerMap.remove(user);
    }


    /**
     * 发生错误是调用方法
     *
     * @param t
     * @throws Throwable
     */
    @OnError
    public void onError(Throwable t) throws Throwable {
        t.printStackTrace();
        logger.error("异常了: " + t.toString());
    }

}
package com.service.im;

import com.util.JsonHelper;
import com.vo.im.MsgVO;
import org.slf4j.LoggerFactory;

import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;


public class ServerDecoder implements Decoder.Text<MsgVO> {
    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ServerDecoder.class);


    @Override
    public MsgVO decode(String s) throws DecodeException {
        logger.info("decode: " + s);
        return JsonHelper.fromJson(s, MsgVO.class);
    }

    @Override
    public boolean willDecode(String s) {
        return true;
    }

    @Override
    public void init(EndpointConfig endpointConfig) {

    }

    @Override
    public void destroy() {

    }
}
package com.service.im;

import com.util.JsonHelper;
import com.vo.im.MsgVO;
import org.slf4j.LoggerFactory;

import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;


public class ServerEncoder implements Encoder.Text<MsgVO> {
    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ServerEncoder.class);



    @Override
    public void init(EndpointConfig endpointConfig) {


    }

    @Override
    public void destroy() {

    }

    @Override
    public String encode(MsgVO o) throws EncodeException {
        logger.info("encode: " + JsonHelper.toJson(o));
        return JsonHelper.toJson(o);
    }
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<HTML>
<HEAD>
    <TITLE>websocket测试</TITLE>
    <META content="text/html; charset=utf-8" http-equiv="Content-Type">
    <LINK rel="stylesheet" href="../../css/im/index.css">
    <LINK rel="stylesheet" href="../../css/bootstrap.min.css">
</HEAD>

<body>

<DIV style="width:470px;">

    <INPUT style="FLOAT: left" id="inp_url" class="form-control" value="" type="text"
           placeholder="连接的用户">

    <BUTTON style="FLOAT: left; MARGIN-LEFT: 10px; MARGIN-RIGHT: 10px" id="btn_conn" class="btn btn-primary"
            onclick="fun_initWebSocket();" type="button">连接
    </BUTTON>
    <BUTTON style="FLOAT: left" id="btn_close" class="btn btn-danger" disabled onclick="fun_close();" type="button">
        断开
    </BUTTON>
</DIV>

<DIV class="zone_send">
    <p>发送消息内容 <A style="float:right; display:none;" id="emoji" title="表情" data-toggle="popover"><IMG
            style="OUTLINE-WIDTH: 40px" src="../../images/huanglianwx_thumb.gif">表情</A></p>
    <TEXTAREA style="HEIGHT: 100px" id="inp_send" class="form-control" placeholder="发送的内容"></TEXTAREA>
    <p>消息接收人</p>
    <input type="text"  style="FLOAT: left" id="ReceiversUser" class="form-control" placeholder="接收用户" value="test2">
    <br>
    <BUTTON id="btn_send" class="btn btn-info" onclick="fun_sendto();" type="button">发送</BUTTON>
</DIV>


<DIV style="POSITION: absolute; TOP: 100px; LEFT: 470px">
    <DIV id="div_msgzone" class="panel panel-default">
        <DIV class="panel-heading">消息窗口</DIV>
        <DIV id="div_msg" class="panel-body"></DIV>
    </DIV>
</DIV>

<SCRIPT type="text/javascript" src="../../js/jquery-1.9.1.min.js"></SCRIPT>
<SCRIPT type="text/javascript" src="../../js/bootstrap.min.js"></SCRIPT>
<SCRIPT type="text/javascript" src="../../js/im/indexSimple.js"></SCRIPT>


</body>
</html>
function fun_initWebSocket() {
    if ($.trim($("#inp_url").val()) == "") {
        alert("请设置连接地址");
        return false;
    }
    // var inp_url = $.trim($("#inp_url").val());
    var inp_url = "ws://localhost:8080/imWebSocket/" + $.trim($("#inp_url").val());
    if (ws_url = $.trim(inp_url).toLocaleLowerCase()) {
        $("#btn_conn").attr("disabled", !0), $("#btn_close").attr("disabled", !1);
        try {
            ws = new WebSocket($.trim(inp_url)), output("等待服务器握手包...", 1, 1), ws.onopen = function () {
                output("收到服务器握手包.", 1, 1), output("连接已建立,正在等待数据...", 0, 1)
            }, ws.onmessage = function (a) {
                output(a.data, 0, 0)
            }, ws.onclose = function () {
                $("#btn_conn").attr("disabled", !1), $("#btn_close").attr("disabled", !0), output("和服务器断开连接!", 0, 1)
            }
        } catch (a) {
            $("#btn_conn").attr("disabled", !1), $("#btn_close").attr("disabled", !0), output("ws的地址错误,请重新输入!", 1, 1)
        }
    }
}
function fun_close() {
    ws.close();
}
function fun_sendto() {
    var user = $.trim($("#inp_url").val());
    var receivedUser = $.trim($("#ReceiversUser").val());
    var message = $.trim($("#inp_send").val());

    var a = '{"code":"0","type":"MSG","receivedUser": "' + receivedUser + '","currentUser": "' + user + '","message":"' + message + '"}';
    //""!=a&&(ws&&1==ws.readyState?(ws.send(a),output(NoHtml(chg_emoji(a)),1,0),$("#inp_send").val("")):alert("连接已经断开!"))
    "" != a && (ws && 1 == ws.readyState ? (ws.send(a), output(a, 1, 0), $("#inp_send").val("")) : alert("连接已经断开!"))
}

function output(a, b, g) {
    var f, c = new Date, d = "blue",  e = "服务器";
    1 == b && (d = "green", e = "我");

    var user = $.trim($("#inp_url").val());

    if (g == 0) {
        var jsonData = $.parseJSON(a);
        //console.log(g);
        console.log(jsonData);

        e = jsonData.currentUser;

        switch (jsonData.type) {
            case "MSG":
                //发送信息
                if (jsonData.message && jsonData.message != "")
                    a = jsonData.message;
                else
                    a = "";

                break;
            default:
                a = "";
                break;
        }

        if (e == user) {
            e = '我';
        }

    }
    if (a != "") {
        f = "<div style='color:" + d + "'>" + e + " " + c.getHours() + ":" + c.getMinutes() + ":" + c.getSeconds() + "</div>";
        $("#div_msg").append("<div style='margin-bottom:10px;position:relative;left:0px;'>" + f + a + "</div>"), $("#div_msg").scrollTop($("#div_msg")[0].scrollHeight);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值