关于websocket无法导入javax.websocket,等一系列问题 - Go语言中文社区

关于websocket无法导入javax.websocket,等一系列问题


主要是要时在工程中导入catalina.jar,websocket-api.jar,其中前者在java中可以找到,后者如果java中找不到可以试着去下载jetty看看里面的.jar文件。

<------------------------------------------------------------------------分割线-------------------------------------------------------------------------------------------->
在服务器端,也出现了一些实现websocket协议的项目:
jetty 7.0.1 包含了一个初步的实现
resin 包含有websocket 实现
pywebsocket, apache http server 扩展
apache tomcat 7.0.27 版本
Nginx 1.3.13 版本
websocket api在浏览器端的广泛实现似乎只是一个时间问题了, 值得注意的是服务器端没有标准的api, 各个实现都有自己的一套api, 并且jcp也没有类似的提案, 所以使用websocket开发服务器端有一定的风险.可能会被锁定在某个平台上或者将来被迫升级.
得意咳咳,以上这大坨来自百度百科,欲知详细请自行查找
吐舌头好了,准备开发环境:java sdk7,Myeclipse10,Tomcat7.47 大笑下载好了自行安装,我不管了
打开MyEclipse新建一个JSP工程,然后导入catalina.jar,websocket-api.jar 可怜什么,你觉得不爽,那你就多导几个吧,反正不要钱,也没人强奸你!



Ok,接下来,新建一个类 WebsocketConfig ,有关抽象类ServerApplicationConfig请查看javaEE7 api 敲打这个很重要,你知道吗,我不哆嗦,你往下看
[java] view plain copy
  1. package com.websocket;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.websocket.Endpoint;  
  7. import javax.websocket.server.ServerApplicationConfig;  
  8. import javax.websocket.server.ServerEndpointConfig;  
  9.   
  10. public class WebsocketConfig implements ServerApplicationConfig{  
  11.   
  12.     @Override  
  13.     public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {  
  14.         // TODO Auto-generated method stub  
  15.         System.out.println("******getAnnotatedEndpointClasses******");  
  16.         // Deploy all WebSocket endpoints defined by annotations in the examples  
  17.         // web application. Filter out all others to avoid issues when running  
  18.         // tests on Gump  
  19.         //这主要是扫描类的包,如果前缀为"com.websocket."就抓住她,然后做什么,你懂的  
  20.         Set<Class<?>> res=new HashSet<>();  
  21.         for(Class<?> cs:scanned){  
  22.             if(cs.getPackage().getName().startsWith("com.websocket.")){  
  23.                 res.add(cs);  
  24.             }  
  25.         }  
  26.         return res;  
  27.     }  
  28.   
  29.     @Override  
  30.     public Set<ServerEndpointConfig> getEndpointConfigs(  
  31.             Set<Class<? extends Endpoint>> scanned) {  
  32.         // TODO Auto-generated method stub  
  33.         System.out.println("******getEndpointConfigs******");  
  34.         Set<ServerEndpointConfig> res=new HashSet<>();  
  35.         /* 
  36.        //使用<span style="font-family: arial, 宋体, sans-serif; ">Programmatic api的服务器地址</span> 
  37.  
  38.         if (scanned.contains(EchoEndpoint.class)) { 
  39.             res.add(ServerEndpointConfig.Builder.create( 
  40.                     EchoEndpoint.class, 
  41.                     "/websocket/echoProgrammatic").build()); 
  42.         } 
  43.         */  
  44.         return res;  
  45.     }  
  46.   
  47. }  

好了,现在我们来建立一个简单chat的ServerEndpoint,据说有两种方式:1、使用@ ServerEndpoint  2、采用继承的方式
我们先来第一种,新建一个类chat1
[java] view plain copy
  1. package com.websocket.chat;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Set;  
  5. import java.util.concurrent.CopyOnWriteArraySet;  
  6. import java.util.concurrent.atomic.AtomicInteger;  
  7.   
  8. import javax.websocket.OnClose;  
  9. import javax.websocket.OnMessage;  
  10. import javax.websocket.OnOpen;  
  11. import javax.websocket.Session;  
  12. import javax.websocket.server.ServerEndpoint;  
  13. import util.HTMLFilter;  
  14.   
  15. @ServerEndpoint(value="/chat01")  
  16. //用了这个之后,你的服务地址为ws://localhost:port/projectName/chat01  
  17.   
  18. public class chat_1 {  
  19.     private static final AtomicInteger connectionIds = new AtomicInteger(0);  
  20.     private static final Set<chat_1> connections =  
  21.             new CopyOnWriteArraySet<chat_1>();  
  22.   
  23.     private final String nickname;  
  24.     private Session session;  
  25.   
  26.     public chat_1() {  
  27.         nickname = "游客ID:" + connectionIds.getAndIncrement();  
  28.     }  
  29.   
  30.   
  31.     @OnOpen  
  32.     public void start(Session session) {  
  33.         this.session = session;  
  34.         connections.add(this);  
  35.         String message = String.format("嗨嗨,姑娘们,来接客了: %s %s", nickname, "has joined.");  
  36.         broadcast(message);  
  37.     }  
  38.   
  39.   
  40.     @OnClose  
  41.     public void end() {  
  42.         connections.remove(this);  
  43.         String message = String.format("客官慢走,嘿嘿,还没付钱呢: %s %s",  
  44.                 nickname, "has disconnected.");  
  45.         broadcast(message);  
  46.     }  
  47.   
  48.   
  49.     @OnMessage  
  50.     public void receive(String message) {  
  51.         // Never trust the client  
  52.         String filteredMessage = String.format("您有新消息:%s: %s",  
  53.                 nickname, HTMLFilter.filter(message.toString()));  
  54.         broadcast(filteredMessage);  
  55.     }  
  56.   
  57.   
  58.     private static void broadcast(String msg) {  
  59.         for (chat_1 client : connections) {  
  60.             try {  
  61.                 client.session.getBasicRemote().sendText(msg);  
  62.             } catch (IOException e) {  
  63.                 connections.remove(client);  
  64.                 try {  
  65.                     client.session.close();  
  66.                 } catch (IOException e1) {  
  67.                     // Ignore  
  68.                 }  
  69.                 String message = String.format("* %s %s",  
  70.                         client.nickname, "has been disconnected.");  
  71.                 broadcast(message);  
  72.             }//try   
  73.         }//for  
  74.     }//void broadcast(String msg)  
  75. }  
  76. /* 
  77.  * 你可能已经注意到我们从 javax.websocket包中引入了一些类。 
  78. @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目 
  79. 前的类定义成一个websocket服务器端。注解的值将被用于监听用户连 
  80. 接的终端访问URL地址。 
  81. onOpen 和 onClose 方法分别被@OnOpen和@OnClose 所注解。 
  82. 这两个注解的作用不言自明:他们定义了当一个新用户连接和断开的时候所调 
  83. 用的方法。 
  84. onMessage 方法被@OnMessage所注解。这个注解定义了当服务器接 
  85. 收到客户端发送的消息时所调用的方法。注意:这个方法可能包含一个 
  86. javax.websocket.Session可选参数(在我们的例子里就是 
  87. session参数)。如果有这个参数,容器将会把当前发送消息客户端的连接 
  88. Session注入进去。 
  89.  */  


index.jsp
[java] view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href="styles.css">  
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     <li><a href="chat01.xhtml">chat01</a></li>  
[java] view plain copy
  1. <pre code_snippet_id="91119" snippet_file_name="blog_20131201_4_6394982" name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px; text-indent: 28px; "><li><a href="chat02.xhtml">chat02</a></li></pre> </body></html>  
  2. <pre></pre>  
  3. <img src="https://img-blog.csdn.net/20131201181020546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluZ2xlbHk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">  
  4. <pre></pre> 


转自:http://blog.csdn.net/xinglely/article/details/17056723

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_38171115/article/details/79602401
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-15 20:25:07
  • 阅读 ( 879 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢