写一个webSocket(重点记录理解servlet的使用方法)

总述:

在当前的web工程中加入socket服务

应用场景:

因为在配合师兄做一个物联网的项目,我负责网页端的数据展示。需要用到socket接收传感器发来的数据,然后实时展示出来


为了完成这个功能,我要解决两个问题:

怎么启动socket去监听客户端发来的消息。怎么在网页端访问server读到的结果。

 好,接下来就这两个方面记录解决的思路。先看一下我要涉及到的类,主要是server、socketHandler两个用作socket服务器(PS:TCP的socket编程之前做好的,课本也有资料也很多,不是这次记录的重点)。initServlet(用于启动我的websocket)和socketDataServlet(用于响应展示实时数据流的请求)是这次的重点。


1、   怎么启动socket

概述:方法就是去写一个启动socket的servlet,然后在web.xml中启动这个servlet。

敲黑板 x1:在对应的servlet 中重写init()方法

servlet中的init()的作用很明显啦,当我希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务的时候就用这个,之后不会因为每次调用再执行一遍。在这里启动socket服务器。

小Tips:我们定义Servlet的时候只需要继承HttpServlet即可。有个类叫GenericServlet,是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。


敲黑板 x2:在web.xml中配置启动socket的servlet

要启动servlet就要去关注Servlet对象是什么时候被创建的

  1. Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。
  2. 在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。
  3. Servlet Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

也就是说,要去web.xml里面配置东西

小Tips:<load-on-startup>1</load-on-startup>的含义是:

标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

正数的值越小,启动该servlet的优先级越高。

 

2、 怎么在网页端访问socket读到的结果

概述:写一个中间类(比如我的socketDataServlet),在这个类中构造一个静态队列,在socketHandler类每次读到数据都放到这个队列中,前端请求过来就是从这个队列中读数据。

这个有思路就不难写,队列的话用List就可以简单实现。


3、总结

Tips1:在web工程里面启动socket不常用,这种模式难支持并发。

Tips2:也有用ServletContextListener,同样也是重写init和destroy对应的方法+在web.xml里面启动。

ServletContextListener能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。而上面写的直接写一个servlet,则是在web启动的时候手动地去启动这个servlet,再由这个servlet去开启socket监听的线程。原理是一样的。

ServletContextListener的用法大概就是,在contextInitialized方法中启动socket服务的线程、在contextDestroyed方法中关闭socket线程的服务,释放监听端口。xml里面改的是<listener>标签。

详细的可以参考这个 http://www.cnblogs.com/w-y-f/p/3289632.html点击打开链接


猜你喜欢

转载自blog.csdn.net/qq_33298609/article/details/60878998
今日推荐