比尔云BierYun--阿里云最新优惠活动
阿里云优惠码丨阿里云代金券

解决浏览器不兼容websocket

解决浏览器不兼容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
未经允许不得转载:比尔云 » 解决浏览器不兼容websocket
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

强烈推荐

高性能SSD云服务器ECS抗攻击,高可用云数据库RDS