当前位置:   article > 正文

java与websocket实现多窗口聊天室_java聊天系统怎么多开窗口

java聊天系统怎么多开窗口

今天由于项目需要,所以看了下websocket,参考了很多博主的博客,如有雷同请谅解,在这里记录一下从一无所知到实现的过程。

websocket的优点和作用百度一大堆就不说了,直接干。

websocket的创建方式有两种,一种比较简单就是基于服务器的,一种基于springmvc的。这里使用的是基于服务器的。

1、在maven中依赖javaee的jar包

  1. <dependency>
  2. <groupId>javax</groupId>
  3. <artifactId>javaee-api</artifactId>
  4. <scope>provided</scope>
  5. </dependency>

2、创建简单的jsp页面

  1. <%@ page language="java" pageEncoding="UTF-8" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>java实现多窗口聊天室</title>
  6. </head>
  7. <body>
  8. 聊天室1:<input id="room1" type="text"/>
  9. <br/>
  10. <button onclick="send1()">发送消息</button><button onclick="quitRoom1()">退出聊天室</button>
  11. <hr/><div id="message1"></div><hr/>
  12. <br/>
  13. <br/>
  14. 聊天室2:<input id="room2" type="text"/>
  15. <br/>
  16. <button onclick="send2()">发送消息</button><button onclick="quitRoom2()">退出聊天室</button>
  17. <hr/><div id="message2"></div><hr/>
  18. <br/>
  19. <br/>
  20. </body>
  21. <script type="text/javascript">
  22. var websocket1 = new WebSocket("ws://localhost.1.3.26:8087/platform_war_exploded/websocket/1");//第一个聊天室
  23. var websocket2 = new WebSocket("ws://localhost:8087/platform_war_exploded/websocket/2");//第二个聊天室
  24. //连接发生异常的回调方法
  25. websocket1.onerror = function () {
  26. showMessage1("WebSocket连接失败");
  27. };
  28. //连接成功建立的回调方法
  29. websocket1.onopen = function () {
  30. showMessage1("WebSocket连接成功");
  31. }
  32. //接收到消息的回调方法
  33. websocket1.onmessage = function (data) {
  34. showMessage1(data.data);
  35. }
  36. //连接关闭的回调方法
  37. websocket1.onclose = function () {
  38. showMessage1("WebSocket连接关闭");
  39. }
  40. //连接发生异常的回调方法
  41. websocket2.onerror = function () {
  42. showMessage2("WebSocket连接失败");
  43. };
  44. //连接成功建立的回调方法
  45. websocket2.onopen = function () {
  46. showMessage2("WebSocket连接成功");
  47. }
  48. //接收到消息的回调方法
  49. websocket2.onmessage = function (data) {
  50. showMessage2(data.data);
  51. }
  52. //连接关闭的回调方法
  53. websocket2.onclose = function () {
  54. showMessage2("WebSocket连接关闭");
  55. }
  56. function showMessage1(msg) {
  57. document.getElementById('message1').innerHTML += msg + '<br/>';
  58. }
  59. function showMessage2(msg) {
  60. document.getElementById('message2').innerHTML += msg + '<br/>';
  61. }
  62. function send1() {
  63. var message = document.getElementById('room1').value;
  64. websocket1.send(message);
  65. }
  66. function send2() {
  67. var message = document.getElementById('room2').value;
  68. websocket2.send(message);
  69. }
  70. //窗口关闭调用断开websocket服务
  71. window.onbeforeunload = function () {
  72. websocket1.close();
  73. websocket2.close();
  74. }
  75. //退出聊天室
  76. function quitRoom1() {
  77. websocket1.close();
  78. }
  79. //退出聊天室
  80. function quitRoom2() {
  81. websocket2.close();
  82. }
  83. </script>
  84. </html>

3、定义后端代码

  1. package com.xlkh.platform.controller;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.concurrent.CopyOnWriteArraySet;
  6. import javax.websocket.*;
  7. import javax.websocket.server.PathParam;
  8. import javax.websocket.server.ServerEndpoint;
  9. /**
  10. * @ServerEndpoint 注解是websocket的注解,用来给用户去访问(前台创建websocket连接的地址)
  11. * roomNum就是聊天室的房间号
  12. */
  13. @ServerEndpoint("/websocket/{roomNum}")
  14. public class HelloWebsocket {
  15. //CopyOnWriteArraySet<HelloWebsocket>用来存放每个客户端的HelloWebsocket对象
  16. private static Map<String, CopyOnWriteArraySet<HelloWebsocket>> webSocketSets = new HashMap<String, CopyOnWriteArraySet<HelloWebsocket>>();
  17. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  18. private Session session;
  19. /**
  20. * 连接建立成功调用的方法
  21. *
  22. * @param roomNum 聊天室的房间号
  23. * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
  24. */
  25. @OnOpen
  26. public void onOpen(@PathParam("roomNum") String roomNum, Session session) {
  27. this.session = session;
  28. //基于没一个房间创建一个webSocketSet 放入webSocketSets中key为房间号,此处判断是否有当前房间,
  29. //如果没有需创建,如果有将当前连接用户放入该房间好对应的CopyOnWriteArraySet中
  30. if (webSocketSets.containsKey(roomNum)) {
  31. webSocketSets.get(roomNum).add(this);
  32. } else {
  33. CopyOnWriteArraySet<HelloWebsocket> webSocketSet = new CopyOnWriteArraySet<HelloWebsocket>();
  34. webSocketSet.add(this);
  35. webSocketSets.put(roomNum, webSocketSet);
  36. }
  37. }
  38. /**
  39. * 连接关闭调用的方法
  40. */
  41. @OnClose
  42. public void onClose(@PathParam("roomNum") String roomNum) {
  43. CopyOnWriteArraySet<HelloWebsocket> set = webSocketSets.get(roomNum);
  44. set.remove(this);
  45. }
  46. /**
  47. * 收到客户端消息后调用的方法
  48. *
  49. * @param roomNum 当前房间号
  50. * @param message 消息内容
  51. */
  52. @OnMessage
  53. public void onMessage(@PathParam("roomNum") String roomNum, String message) {
  54. System.out.println("当前房间号:" + roomNum);
  55. System.out.println("消息内容:" + message);
  56. CopyOnWriteArraySet<HelloWebsocket> helloWebsockets = webSocketSets.get(roomNum);
  57. //群发消息
  58. for (HelloWebsocket item : helloWebsockets) {
  59. try {
  60. item.sendMessage(message);
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. continue;
  64. }
  65. }
  66. }
  67. /**
  68. * 发生错误时调用
  69. *
  70. * @param session
  71. * @param error
  72. */
  73. @OnError
  74. public void onError(Session session, Throwable error) {
  75. System.out.println("websocket异常,异常信息如下:");
  76. error.printStackTrace();
  77. }
  78. /**
  79. * 根据当前用户的session去发送消息
  80. *
  81. * @param message
  82. * @throws IOException
  83. */
  84. public void sendMessage(String message) throws IOException {
  85. this.session.getBasicRemote().sendText(message);
  86. }
  87. }

4、效果展示

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

闽ICP备14008679号