解决浏览器不兼容websocket

简介: 解决浏览器不兼容websocke原文地址thttp://www.bieryun.com/935.html 本例使用tomcat 7.0的websocket做为例子。 1.新建web project。

解决浏览器不兼容websocke原文地址thttp://www.bieryun.com/935.html

本例使用tomcat 7.0的websocket做为例子。

1.新建web project。
2.找到tomcat 7.0 lib 下的 catalina.jar,tomcat-coyote.jar添加到项目中.
3.如下是我的目录结构


web.xml的配置.

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  5.     <display-name>Archetype Created Web Application</display-name>
  6.     <servlet>
  7.         <servlet-name>serverSocket</servlet-name>
  8.         <servlet-class>com.sun.websocket.server.ServerSocket</servlet-class>
  9.     </servlet>
  10.     <servlet-mapping>
  11.         <servlet-name>serverSocket</servlet-name>
  12.         <url-pattern>/serverSocket</url-pattern>
  13.     </servlet-mapping>
  14.       <welcome-file-list>
  15.         <welcome-file>index.jsp</welcome-file>
  16.       </welcome-file-list>
  17. </web-app>

ServerSocket.java的源码.

[java] view plain copy

  1. package com.sun.websocket.server;
  2. import java.io.IOException;
  3. import java.nio.ByteBuffer;
  4. import java.nio.CharBuffer;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.UUID;
  10. import java.util.concurrent.ConcurrentHashMap;
  11. import javax.servlet.http.HttpServletRequest;
  12. import org.apache.catalina.websocket.MessageInbound;
  13. import org.apache.catalina.websocket.StreamInbound;
  14. import org.apache.catalina.websocket.WebSocketServlet;
  15. import org.apache.catalina.websocket.WsOutbound;
  16. public class ServerSocket extends WebSocketServlet {
  17.     private static final long serialVersionUID = -4853540828121130946L;
  18.     private static Map< String , MyMessageInbound> mmiList = new ConcurrentHashMap< String , MyMessageInbound >();
  19.     private String message_to ;
  20.     private String message_me ;
  21.     @Override
  22.     protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest request) {
  23.         message_me = request.getParameter( "message_me" );
  24.         message_to = request.getParameter( "message_to" );
  25.         return new MyMessageInbound();
  26.     }
  27.     private class MyMessageInbound extends MessageInbound  {
  28.         WsOutbound myoutbound;
  29.         private String me = message_me ;
  30.         private String to = message_to ;
  31.         @Override
  32.         public void onOpen(WsOutbound outbound) {
  33.             try {
  34.                 System.out.println("Open " + me + " to " + to);
  35.                 this.myoutbound = outbound;
  36.                 mmiList.put( me , this );
  37.                 outbound.writeTextMessage(CharBuffer.wrap("Hello!"));
  38.             } catch (IOException e) {
  39.                 e.printStackTrace();
  40.             }
  41.         }
  42.         @Override
  43.         public void onTextMessage(CharBuffer cb) throws IOException {
  44.             System.out.println("Accept Message : " + cb);
  45.             for ( String mmib : mmiList.keySet() ) {
  46.                 if ( !to.equals(mmib) )
  47.                     continue;
  48.                 try
  49.                 {
  50.                     CharBuffer buffer = CharBuffer.wrap(cb);
  51.                     mmiList.get(mmib).myoutbound.writeTextMessage(buffer);
  52.                     mmiList.get(mmib).myoutbound.flush();
  53.                 }
  54.                 catch (Exception e) {
  55.                     continue;
  56.                 }
  57.                 break;
  58.             }
  59.         }
  60.         @Override
  61.         public void onClose(int status) {
  62.             if( status == 1002 || status == 1000)
  63.             {
  64.                 System.out.println("Close " + me + " to " + to);
  65.                 mmiList.remove(this);
  66.             }
  67.         }
  68.         @Override
  69.         public void onBinaryMessage(ByteBuffer bb) throws IOException {
  70.         }
  71.     }
  72. }

接下来编写index.jsp

[html] view plain copy

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8.   <head>
  9.     <base href="<%=basePath%>">
  10.     <title>My JSP 'index.jsp' starting page</title>
  11.     <meta http-equiv="pragma" content="no-cache">
  12.     <meta http-equiv="cache-control" content="no-cache">
  13.     <meta http-equiv="expires" content="0">
  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15.     <meta http-equiv="description" content="This is my page">
  16.     <script type="text/javascript" src="scripts/swfobject.js"></script>
  17.     <script type="text/javascript" src="scripts/jquery.js"></script>
  18.     <script type="text/javascript" src="scripts/web_socket.js"></script>
  19.     <script type="text/javascript" src="scripts/jquery.WebSocket.js"></script>
  20.     <%
  21.         String message_to = request.getParameter( "message_to" );
  22.         String message_me = request.getParameter( "message_me" );
  23.         request.setAttribute( "message_to" , message_to );
  24.         request.setAttribute( "message_me" , message_me );
  25.     %>
  26. <script>
  27.     $(function ()
  28.     {
  29.         window.onbeforeunload = onbeforeunload_handler;
  30.         window.onunload = onunload_handler;
  31.         function onbeforeunload_handler(){
  32.             //ws.close();
  33.             return warning;
  34.         }
  35.         function onunload_handler()
  36.         {
  37.             //alert(1);
  38.             ws = null;
  39.         }
  40.     });
  41.     var message_to = "${message_to}";
  42.     var message_me = "${message_me}";
  43.     //var ws = new WebSocket("ws://192.168.202.56:8080/websocket_msg/serverSocket?message_to="+message_to+"&message_me="+message_me);
  44.     var url = "websocket_msg/serverSocket?message_to="+message_to+"&message_me="+message_me;
  45.     var ws = new $.websocket({
  46.         protocol : "websocket_msg/serverSocket?message_to="+message_to+"&message_me="+message_me,
  47.         domain : "192.168.1.120",
  48.         port : "8080",
  49.         onOpen:function(event){
  50.             showMessage("已成功登录");
  51.         },
  52.         onError:function(event){
  53.              alert("error:"+ event)
  54.         },
  55.         onMessage:function(result){
  56.             receiveMessage(result);
  57.         },
  58.         onClose:function(event){
  59.             ws = null;
  60.         }
  61.     });
  62.     function send(){
  63.         if(!ws){
  64.             alert("已经断开聊天室");
  65.             return;
  66.         }
  67.          var msg=$.trim($("#msg").val());
  68.          if(msg==""){return;}
  69.          ws.send(msg);
  70.          $("#messageInput").val("").focus();;
  71.     }
  72.     function receiveMessage(result){
  73.         showMessage(result);
  74.     }
  75.     function showMessage(msg){
  76.         document.getElementById("chatlog").textContent += msg + "\n";
  77.     }
  78. </script>
  79.   </head>
  80.   <body>
  81.     <body>
  82.         <textarea id="chatlog" readonly style="width:500px;height:500px;"></textarea><br/>
  83.         <input id="msg" type="text" />
  84.         <button type="submit" id="sendButton" onClick="send()">Send!</button>
  85.         <button type="submit" id="sendButton" onClick="closeConnect()">End</button>
  86.     </body>
  87.   </body>
  88. </html>

编写完成后,访问index.jsp时需要URL给出两个参数。一个代表发送者,一个代表接收者。

[html] view plain copy

  1. 例如 ?message_to=1&message_me=2"

相关文章
|
6月前
|
XML 存储 网络协议
tcp支持浏览器websocket协议
tcp支持浏览器websocket协议
|
25天前
|
监控 前端开发 JavaScript
浏览器节能机制导致Websocket断连的坑
浏览器节能机制导致Websocket断连的坑
32 0
|
5月前
|
监控 前端开发 JavaScript
记录浏览器节能机制导致Websocket断连问题
近期,在使用WebSocket(WS)连接时遇到了频繁断连的问题,这种情况在单个用户上每天发生数百次。尽管利用了socket.io的自动重连机制能够在断连后迅速恢复连接,但这并不保证每一次重连都能成功接收WS消息。因此,我们进行了一些的排查和测试工作。
406 1
记录浏览器节能机制导致Websocket断连问题
|
6月前
|
前端开发 JavaScript API
如何让 Websocket兼容低版本浏览器
如何让 Websocket兼容低版本浏览器
226 2
|
JavaScript 前端开发 CDN
CDN引入vue不兼容IE浏览器
CDN引入vue不兼容IE浏览器
126 0
|
前端开发 JavaScript Java
websocket部署后在谷歌内核浏览器异常断开问题
后端springboot前端vue开发的网页,利用websocket实现操作数据库前端网页实时刷新的功能
websocket部署后在谷歌内核浏览器异常断开问题
|
JavaScript 前端开发 CDN
CDN引入vue不兼容IE浏览器
CDN引入vue不兼容IE浏览器
116 0
从手机App通过WebSocket向浏览器推送数据
启动Orchestra,WebSocket server for KOI 和WebShop,共计3台服务器。 启动一个KOI App模拟器,两个WebShop模拟器。
从手机App通过WebSocket向浏览器推送数据
从手机App通过WebSocket向浏览器推送数据
启动Orchestra,WebSocket server for KOI 和WebShop,共计3台服务器。 启动一个KOI App模拟器,两个WebShop模拟器。
从手机App通过WebSocket向浏览器推送数据
|
14天前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
32 0