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);
}
}