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

    xiaoxiao2021-03-25  119

    总述:

    在当前的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对象是什么时候被创建的

    Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。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点击打开链接

    转载请注明原文地址: https://ju.6miu.com/read-5243.html

    最新回复(0)