var wsUri = "ws://localhost/Websocket/IMSer...">
当前位置:   article > 正文

websocket简介和java实例

websocket简介和java实例

目录

1.websocket 简介

2.实例

2.1前台接、发消息

2.2后台发消息

2.3完整项目下载


1.websocket 简介

     简介传送门

2.实例

2.1前台接、发消息

   前台页面代码

  1. <script type="text/javascript">
  2. var wsUri = "ws://localhost/Websocket/IMServer?userid=rz_${rybh}&username=${XM}";
  3. var socket = new WebSocket(wsUri);
  4. //发送消息
  5. socket.send(message);
  6. //websocket建立连接
  7. socket.onopen = function(evt) {
  8. };
  9. //websocket监听接收消息
  10. socket.onmessage = function(evt) {
  11. }
  12. </script>

IMserver.java

  1. package com.test;
  2. import java.io.IOException;
  3. import java.io.UnsupportedEncodingException;
  4. import java.net.URLDecoder;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import javax.websocket.OnClose;
  8. import javax.websocket.OnMessage;
  9. import javax.websocket.OnOpen;
  10. import javax.websocket.Session;
  11. import javax.websocket.server.ServerEndpoint;
  12. import com.google.gson.Gson;
  13. /**
  14. * 桌面窗口对话服务端
  15. * 标识 userid+DESKSERVER
  16. *
  17. */
  18. @ServerEndpoint("/IMServer")
  19. public class EchoServer {
  20. String fgf="###"; //分隔符
  21. private String toUser;
  22. private String userid;//消息发送人id
  23. private String username;//消息发送人姓名
  24. private String fromUser;
  25. private String hyid;//会话id
  26. public String getHyid() {
  27. return hyid;
  28. }
  29. public void setHyid(String hyid) {
  30. this.hyid = hyid;
  31. }
  32. public String getUserid() {
  33. return userid;
  34. }
  35. public void setUserid(String userid) {
  36. this.userid = userid;
  37. }
  38. public String getUsername() {
  39. return username;
  40. }
  41. public void setUsername(String username) {
  42. this.username = username;
  43. }
  44. public String getFromUser() {
  45. return fromUser;
  46. }
  47. public void setFromUser(String fromUser) {
  48. this.fromUser = fromUser;
  49. }
  50. public String getToUser() {
  51. return toUser;
  52. }
  53. public void setToUser(String toUser) {
  54. this.toUser = toUser;
  55. }
  56. @OnOpen
  57. public void initSession(Session session) throws UnsupportedEncodingException {
  58. this.setToUser(session.getRequestParameterMap().get("toUser").get(0));
  59. this.setUserid(session.getRequestParameterMap().get("userid").get(0));
  60. this.setUsername(URLDecoder.decode(session.getRequestParameterMap().get("username").get(0)+"","UTF-8"));
  61. this.setHyid(session.getRequestParameterMap().get("hyid").get(0));
  62. SessionMap.sessions.put(this.getUserid()+"DESKSERVER", session);//DESKSERVER桌面聊天设置
  63. //SessionUtil.sessions.add(session);
  64. }
  65. @OnMessage
  66. public void echo(String incomingMessage){
  67. // System.err.println("发送消息内容:"+incomingMessage);
  68. String hyids=this.getToUser();
  69. if(null!=hyids&&!"".equals(hyids)){
  70. String[] ryids = hyids.split(",");
  71. for(int i=0;i<ryids.length;i++){
  72. // System.err.println("发送消息给::"+ryids[i]);
  73. Session session=SessionMap.sessions.get(ryids[i]);
  74. String[] incomingMessages=incomingMessage.split(fgf);
  75. if(session!=null){
  76. Map<String, Object> map=new HashMap<String, Object>();
  77. map.put("Msgsdate",incomingMessages[1]);//消息发送时间
  78. map.put("Msgsreturnid",incomingMessages[2]);//消息id
  79. map.put("Msgs",incomingMessages[0]);//消息
  80. map.put("SenderId", this.getUserid());//发送人id
  81. map.put("SenderName", this.getUsername());//发送人姓名
  82. map.put("hyid", this.getHyid());//发送人姓名
  83. String json=new Gson().toJson(map);
  84. sendMessage(session, json);
  85. }
  86. }
  87. }
  88. }
  89. private void sendMessage(Session session, String msg) {
  90. try {
  91. session.getBasicRemote().sendText(msg);
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. // @OnError
  97. // public void processError(Session session){
  98. // SessionUtil.sessions.remove(session);
  99. // }
  100. @OnClose
  101. public void processClose(Session session){
  102. SessionMap.sessions.remove(this.getUserid()+"DESKSERVER");
  103. }
  104. }

结合 layim

  1. layui.use('layim',function(layim) {
  2. //基础配置
  3. layim.config({
  4. //或采用以下方式初始化接口
  5. //或采用以下方式初始化接口
  6. init : {
  7. url : '${ctx}/api/layui/lxrlist',
  8. data : {}
  9. }
  10. //查看群员接口
  11. ,members : {
  12. url : '${ctx}/api/layui/qzrylist',
  13. data : {}
  14. }
  15. //上传图片接口
  16. ,
  17. uploadImage : {
  18. url : '${ctx}/api/layui/fileUpload' //(返回的数据格式见下文)
  19. ,
  20. type : '' //默认post
  21. }
  22. //上传文件接口
  23. ,
  24. uploadFile : {
  25. url : '${ctx}/api/layui/fileUploadfile' //(返回的数据格式见下文)
  26. ,
  27. type : '' //默认post
  28. }
  29. //扩展工具栏
  30. // ,tool: [{
  31. // alias: 'code'
  32. // ,title: '代码'
  33. // ,icon: '&#xe64e;'
  34. // }]
  35. //,brief: true //是否简约模式(若开启则不显示主面板)
  36. ,
  37. title : '即时通讯' //自定义主面板最小化时的标题
  38. //,right: '100px' //主面板相对浏览器右侧距离
  39. //,minRight: '90px' //聊天面板最小化时相对浏览器右侧距离
  40. ,
  41. //right: '15%', //主面板相对浏览器右侧距离
  42. //minRight: '200px',//用户控制聊天面板最小化时、及新消息提示层的相对right的px坐标。
  43. initSkin : '3.jpg' //1-5 设置初始背景
  44. //,skin: ['aaa.jpg'] //新增皮肤
  45. //,isfriend: false //是否开启好友
  46. ,
  47. isgroup : true //是否开启群组
  48. ,
  49. min : true //是否始终最小化主面板,默认false
  50. ,
  51. notice : true //是否开启桌面消息提醒,默认false
  52. ,
  53. voice : false //声音提醒,默认开启,声音文件为:default.wav
  54. ,
  55. copyright : true
  56. // ,msgbox: layui.cache.dir + 'css/modules/layim/html/msgbox.html' //消息盒子页面地址,若不开启,剔除该项即可
  57. //,find: layui.cache.dir + 'css/modules/layim/html/find.html' //发现页面地址,若不开启,剔除该项即可
  58. ,
  59. chatLog : layui.cache.dir+ 'css/modules/layim/html/chat.jsp' //聊天记录页面地址,若不开启,剔除该项即可
  60. });
  61. /* var cache = layui.layim.cache();
  62. var local = layui.data('layim')[cache.mine.id]; //获取当前用户本地数据
  63. //这里以删除本地聊天记录为例
  64. delete local.chatlog;
  65. //向localStorage同步数据
  66. layui.data('layim', {
  67. key: cache.mine.id
  68. ,value: local
  69. }); */
  70. //监听在线状态的切换事件
  71. layim.on('online', function(data) {
  72. //console.log(data);
  73. });
  74. //监听签名修改
  75. layim.on('sign', function(value) {
  76. //console.log(value);
  77. });
  78. //监听自定义工具栏点击,以添加代码为例
  79. // layim.on('tool(code)', function(insert){
  80. // layer.prompt({
  81. // title: '插入代码'
  82. // ,formType: 2
  83. // ,shade: 0
  84. // }, function(text, index){
  85. // layer.close(index);
  86. // insert('[pre class=layui-code]' + text + '[/pre]'); //将内容插入到编辑器
  87. // });
  88. // });
  89. //监听layim建立就绪
  90. layim.on('ready', function(res) {
  91. //console.log(res.mine);
  92. //layim.msgbox(5); //模拟消息盒子有新消息,实际使用时,一般是动态获得
  93. setTimeout(function() {
  94. var obj = {};
  95. //接受消息(如果检测到该socket)
  96. }, 3000);
  97. });
  98. // 打开layim时建立websocket服务端连接
  99. var wsUri = "ws://localhost/Websocket/IMServer?userid=rz_${rybh}&username=${XM}";
  100. var socket = new WebSocket(wsUri);
  101. //监听发送消息
  102. layim.on('sendMessage', function(data) {
  103. var To = data.to;
  104. if (To.type === 'friend') {
  105. socket.send(data.to.id + "#@@#" + JSON.stringify(data)); //websocket 发送消息
  106. }
  107. //发送消息内容持久化
  108. $.ajax({
  109. type : 'post',
  110. data : {
  111. key : JSON.stringify(data)
  112. },
  113. url : '${ctx}/api/layui/sendmessage',
  114. success : function(val) {
  115. }
  116. });
  117. });
  118. //websocket建立连接
  119. socket.onopen = function(evt) {
  120. };
  121. //websocket监听接收消息
  122. socket.onmessage = function(evt) {
  123. evt = JSON.parse(evt.data);
  124. layim.getMessage({
  125. username : evt.mine.username, //消息来源用户名
  126. avatar : evt.mine.avatar, //消息来源用户头像
  127. id : evt.mine.id, //消息的来源ID(如果是私聊,则是用户id,如果是群聊,则是群组id)
  128. type : evt.to.type, //聊天窗口来源类型,从发送消息传递的to里面获取
  129. content : evt.mine.content, //消息内容
  130. cid : 0, //消息id,可不传。除非你要对消息进行一些操作(如撤回)
  131. mine : false, //是否我发送的消息,如果为true,则会显示在右方
  132. fromid : evt.mine.id //消息的发送者id(比如群组中的某个消息发送者),可用于自动解决浏览器多窗口时的一些问题
  133. timestamp : new Date().getTime()//服务端动态时间戳
  134. });
  135. };
  136. socket.onerror = function(evt) {
  137. // console.log("ERROR!!!!");
  138. //writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
  139. //socket.close();
  140. };
  141. //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  142. window.onbeforeunload = function () {
  143. socket.close();
  144. };
  145. //监听查看群员
  146. layim.on('members', function(data) {
  147. //console.log(data);
  148. });
  149. //监听聊天窗口的切换
  150. layim.on('chatChange', function(res) {
  151. var type = res.data.type;
  152. });
  153. });

2.2后台发消息

MyClient.java     websocket客户端 

  1. package com.utils.websocket;
  2. import javax.websocket.ClientEndpoint;
  3. import javax.websocket.OnClose;
  4. import javax.websocket.OnError;
  5. import javax.websocket.OnMessage;
  6. import javax.websocket.OnOpen;
  7. import javax.websocket.Session;
  8. @ClientEndpoint
  9. public class MyClient {
  10. @OnOpen
  11. public void onOpen(Session session) {
  12. }
  13. @OnMessage
  14. public void onMessage(String message) {
  15. }
  16. @OnClose
  17. public void processClose(Session session){
  18. }
  19. @OnError
  20. public void onError(Throwable t) {
  21. t.printStackTrace();
  22. }
  23. }

ConnToServer.java   连接websocket服务端

  1. package com.utils.websocket;
  2. import java.io.IOException;
  3. import java.net.URI;
  4. import java.net.URISyntaxException;
  5. import javax.websocket.ContainerProvider;
  6. import javax.websocket.DeploymentException;
  7. import javax.websocket.Session;
  8. import javax.websocket.WebSocketContainer;
  9. public class ConnToServer {
  10. public Session session;
  11. /**
  12. * 连接websocket server
  13. * @param uri
  14. */
  15. public void start(String uri) {
  16. WebSocketContainer container = ContainerProvider.getWebSocketContainer();
  17. try {
  18. session = container.connectToServer(MyClient.class, new URI(uri));
  19. } catch (DeploymentException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. } catch (URISyntaxException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

PushMsg.java      消息发送工具类

  1. package com.test.push;
  2. import java.net.URI;
  3. import java.net.URLEncoder;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8. import org.apache.log4j.Logger;
  9. import com.fasterxml.jackson.dataformat.yaml.snakeyaml.util.UriEncoder;
  10. import com.utils.websocket.ConnToServer;
  11. /**
  12. * 消息发送工具类
  13. *
  14. * @author Administrator
  15. *
  16. */
  17. public final class PushMsg {
  18. private PushMsg(){};
  19. private static Logger logger = Logger.getLogger(PushMsg.class);
  20. /**给指定的人发送消息提醒
  21. *
  22. * @param message (消息内容)
  23. * @param userId (发送对象)
  24. */
  25. public static void sendMessage(Message message) {
  26. try {
  27. // 推送消息
  28. List<Map<String, Object>> list=message.getMsgDatas();
  29. if(!list.isEmpty()&&list.size()>0){
  30. Map<String, Object> map=list.get(0);
  31. String username=map.get("xm")+"";
  32. String sender=map.get("sender")+"";
  33. String reciver=map.get("reciver")+"";
  34. String content=map.get("content")+"";
  35. username=URLEncoder.encode(username,"UTF-8");
  36. //建立连接,发送消息
  37. String uri = "ws://localhost:1234/websocket/echo?sender="+sender+"&username="+username+"&reciver="+reciver;
  38. ConnToServer cts=new ConnToServer();
  39. cts.start(uri);//
  40. cts.session.getBasicRemote().sendText(content);
  41. cts.session.close();
  42. }
  43. } catch (Exception e) {
  44. logger.error(e.getCause());
  45. }
  46. }
  47. }

2.3完整项目下载

   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/249104
推荐阅读
相关标签
  

闽ICP备14008679号