㈠ maven怎么引入comet4j
下载服务端jar文件
Comet4J目前仅支持Tomcat6、7版本,根据您所使用的Tomcat版本下载【comet4j-tomcat6.jar】或【comet4j-tomcat7.jar】文件放置到WEB项目的WEB-INF\lib目录下。
下载客户端js文件
下载【comet4j.js】到您的项目中,比如:WebContent\js目录下。
修改服务器配置文件
因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。 打开server.xml文件将找到原先的连接器配置:
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
替换为:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
在web.xml中加载Comet4J框架
最后我们需要在web.xml配置侦听和comet连接地址,以使Comet4J生效:
<listener>
<description>Comet4J容器侦听</description>
<listener-class>org.comet4j.core.CometAppListener</listener-class>
</listener>
<servlet>
<description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
<display-name>CometServlet</display-name>
<servlet-name>CometServlet</servlet-name>
<servlet-class>org.comet4j.core.CometServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CometServlet</servlet-name>
<url-pattern>/conn</url-pattern>
</servlet-mapping>
这里是最小化配置,更多配置请参见【更多资料】。至此所有的准备工作已经就绪,现在让我们来开发一个HelloWorld吧!
客户端使用简介
客户端是一个javaScript文件(comet4j-0.0.2.js),其中最重要的是JS.Connector和JS.Engine两个类。JS.Connector负责与服务器建立并保持连接,而JS.Engine类负责将服务器推送过来的消息转化为开发人员可以处理的消息事件,并分发出去,关于客户端的API请参见:http://comet4j.axiao.org:8080/comet4j/cdoc/ 。大多数情况下,我们仅需要使用JS.Engine类就可以完成多数的开发工作。
JS.Engine类是一个静态类,在一个页面中只有一个JS.Engine类的实例。它除了负责把服务器推过来的消息转化为事件分发以外,与服务器的连接与断开也由此类负责。
JS.Engine.start方法
JS.Engine.start(String str)和JS.Engine.stop(String str)分别控制连接和断开动作,start方法需要传入一个字符串参数,用来指定您配置的Comet4J连接地址。比如按前面准备工作的配置了CometServlet的地址为/conn,那么可以这样写:
JS.Engine.start('/conn');
上段代码我们让浏览器与服务器进行连接,当连接成功以后JS.Engine类会发出"start"事件,如何进行事件的处理我们稍后介绍。
JS.Engine.stop方法
我们也能够让连接断开:
JS.Engine.stop('主动断开');
上面代码我们让连接断开,并传入了一个“主动断开”这样一个断开的原因。如果您并不需要对断开的原因进行说明,也可以不传递参数:
JS.Engine.stop();
JS.Engine类的事件处理
上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JS.Engine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JS.Engine.on方法来注册事件处理函数。例如:
JS.Engine.on('start',function(cId, channelList, engine){
alert('连接已建立,连接ID为:' + cId);
});
JS.Engine.on('stop',function(cause, cId, url, engine){
alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);
});
也可以将上段代码写成,下面代码与上段代码完全等效:
JS.Engine.on({
start : function(cId, channelList, engine){
alert('连接已建立,连接ID为:' + cId);
},
stop : function(cause, cId, url, engine){
alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);
}
});
接下来,介绍一下如何对服务器推送过来的消息进行处理。在介绍之前,我们假设后台已经注册了一个"hello"的应用通道标识,并且只向客户端推送简单的字符串信息。先看如下代码:
JS.Engine.on('hello',function(text){
alert(text);
});
这样当服务器端使用"hello"通道标识推送过来的消息就可以由上段代码进行处理,将推送过来的信息弹出。
特别注意:以上代码在事件处理函数中使用了alert仅为说明函数功能,实际使用中,在事件处理函数中切勿使用alert、prompt、confirm等可以中断脚本运行的函数,因为Engine需要实时的保持工作状态。
服务器端使用简介
服务端由一个Jar包组成,其中最重的是CometContext和CometEngine两个类。
Comet Context 类
CometContext是一个单态类,通过其getInstance方法来获得实例,它主要负责框架的一些初始化工作保存着一些参数的配置值,除此之外它还有一个更重要的职责——负责注册应用通道标识。如果您想使用框架来实现自己的应用,那么您必需要为自己的应用分配一个唯一的通道标识,并将此通道标识在WEB容器启动时使用CometContext的registChannel方法进行注册,这样,客户端才可以正确接受此应用所推送的消息。注册一个通道标识非常简单:
CometContext.getInstance().registChannel("hello");
这样便注册了一个标识为“hello”的应用通道,而客户也可以通过JS.Engine.on('hello',function(msg){...})的形式来接收并处理来自此通道的消息。
Comet Engine 类
另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息:
String channel = "hello";
String someConnectionId = "1125-6634-888";
engine.sendToAll(channel , "我来了!");
engine.sendTo(channel , engine.getConnection(someConnectionId),“Hi,我是XXX”);
上面代码使用sendToAll方法向所有客户端在"hello"通道上发送了“我来了!”这样一条消息,然后又使用sendTo在同样的通道上向某一个连接发送了“Hi,我是XXX”消息。 CometEngine另外一个很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通过对这些事件的处理来实现具体的功能:
class JoinListener extends ConnectListener {
@Override
public boolean handleEvent(ConnectEvent anEvent) {
CometConnection conn = anEvent.getConn();
CometContext.getInstance().getEngine().sendTo("hello", conn.getId(),"欢迎上线");
}
}
CometEngine engine = CometContext.getInstance().getEngine();
engine.addConnectListener(new JoinListener());
㈡ Netty笔记之六:Netty对websocket的支持
WebSocket是一种规范,是Html5规范的一部分,websocket解决什么问题呢?解决http协议的一些不足。我们知道,http协议是一种无状态的,基于请求响应模式的协议。
网页聊天的程序(基于http协议的),浏览器客户端发送一个数据,服务器接收到这个浏览器数据之后,如何将数据推送给其他的浏览器客户端呢?
这就涉及到服务器的推技术。早年为了实现这种服务器也可以像浏览器客户端推送消息的长连接需求,有很多方案,比如说最常用的采用一种轮询技术,就是客户端每隔一段时间,比如说2s或者3s向服务器发送请求,去请求服务器端是否还有信息没有响应给客户端,有就响应给客户端,当然没有响应就只是一种无用的请求。
这种长轮询技术的缺点有:
1)响应数据不是实时的,在下一次轮询请求的时候才会得到这个响应信息,只能说是准实时,而不是严格意义的实时。
2)大多数轮询请求的空轮询,造成大量的资源带宽的浪费,每次http请求携带了大量无用的头信息,而服务器端其实大多数都不关注这些头信息,而实际大多数情况下这些头信息都远远大于body信息,造成了资源的消耗。
拓展
比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。
WebSocket一种在单个 TCP 连接上进行 全双工通讯 的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。WebSocket API也被W3C定为标准。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许 服务端主动向客户端推送数据 。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
websocket的出现就是解决了客户端与服务端的这种长连接问题,这种长连接是真正意义上的长连接。客户端与服务器一旦连接建立双方就是对等的实体,不再区分严格意义的客户端和服务端。长连接只有在初次建立的时候,客户端才会向服务端发送一些请求,这些请求包括请求头和请求体,一旦建立好连接之后,客户端和服务器只会发送数据本身而不需要再去发送请求头信息,这样大量减少了
网络带宽。websocket协议本身是构建在http协议之上的升级协议,客户端首先向服务器端去建立连接,这个连接本身就是http协议只是在头信息中包含了一些websocket协议的相关信息,一旦http连接建立之后,服务器端读到这些websocket协议的相关信息就将此协议升级成websocket协议。websocket协议也可以应用在非浏览器应用,只需要引入相关的websocket库就可以了。
HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如:
优点
浏览器页面向服务器发送消息,服务器将当前消息发送时间反馈给浏览器页面。
服务器端
服务器端初始化连接
:参数是访问路径,这边指定的是ws,服务客户端访问服务器的时候指定的url是: ws://localhost:8899/ws 。
它负责websocket握手以及处理控制框架(Close,Ping(心跳检检测request),Pong(心跳检测响应))。 文本和二进制数据帧被传递到管道中的下一个处理程序进行处理。
桢 :
WebSocket规范中定义了6种类型的桢,netty为其提供了具体的对应的POJO实现。
WebSocketFrame:所有桢的父类,所谓桢就是WebSocket服务在建立的时候,在通道中处理的数据类型。本列子中客户端和服务器之间处理的是文本信息。所以范型参数是TextWebSocketFrame。
自定义Handler
页面 :
启动服务器,然后运行客户端页面,当客户端和服务器端连接建立的时候,服务器端执行 handlerAdded 回调方法,客户端执行 onopen 回调方法
服务器端控制台:
页面:
客户端发送消息,服务器端进行响应,
服务端控制台打印:
客户端也收到服务器端的响应:
打开开发者工具 :
在从标准的HTTP或者HTTPS协议切换到WebSocket时,将会使用一种升级握手的机制。因此,使用WebSocket的应用程序将始终以HTTP/S作为开始,然后再执行升级。这个升级动作发生的确定时刻特定与应用程序;它可能会发生在启动时候,也可能会发生在请求了某个特定的IURL之后。
参考技术
java web 服务器推送技术--comet4j
Comet:基于 HTTP 长连接的“服务器推”技术
㈢ Java Web 服务器的消息推送 几种方案
Java Web 服务器的消息推送有以下几种方案:㈣ Java培训机构哪家好
随着Java的持续火热,市面上的培训学校也如雨后春笋,发展越来越快。这其中,肯定有一些打着培训旗号“坑钱”的不良学校。大家对这样的问题如此关心,想必也深深考虑过落入这些学校的后果。那如何增强自己的眼力,判断其中的良莠,就显得尤为重要。
建议在选择时还是要自己去实地考察,多了解相关信息,自己做出判断。我们可以从几个方面来考虑:
1,学校口碑。一个学校怎么样,从校内学生的口中就可以得到真实口碑,建议多多实地考察,多问下校内学生,获取真实信息。
2,课程内容。学校的质量怎么样,肯定要着重考虑学校教学质量,看看上课的课程质量如何,课程是否有用,安排是否合理。除了理论课是否还有实战课。除了查询官网的课程信息,最好是直接到学校参与试听课。感受真实的授课环境和课程内容。
3,教师力量。课程再好也是老师来教,这时候就要了解学校的老师水平如何,看看有没有大企业的任职经验和多年的软件开发经验。
掌握了这些消息,你大概能够判断每个学校的优劣特点了,接下来就综合考虑其他因素做出选择。
当然,找到了靠谱的学校,并不意味着你就成功了,这还只是个开始。接下来如何发展,就完全看你自己的个人努力了,只要你真的努力付出心血了,那一定可以成功。
㈤ java培训有哪些课程
市面上大多数的java课程内容其实都大同小异,理论知识讲解会在四个月左右。而接下来会进行长达一个月左右的实战演练环节。
理论课程上,最开始肯定是最基础的内容:JavaSE,这一阶段会接触到Java基础语法、面向对象编程思想、Java常用API、多线程并发编程、数据结构/集合框架、IO/网络编程/反射/设计模式。这一阶段往往也是最重要的,后面很多知识和框架的应用都是基于这一基础来的。学完这一部分,就能做一些简单的桌面应用程序设计。
之后,就是一些比较进阶的内容了,主流数据库管理系统、Java前端开发技术、流行框架应用,都是要慢慢深入的。
最后,也是最重要的,就是实战项目的训练,掌握了再多理论知识没有实战的支撑也没有用。而企业需要的也正是你的实战能力。
可能表面上看大多数的学校课程都很雷同,但其实也有要注意的点,就是看学校的课程有没有实时更新。随着时代发展,Java也融入了很多新元素。只有最新的课程才是企业真正所需要的。