`
zhyt710
  • 浏览: 205651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

应用servlet实现http的长连接

阅读更多

为了实现服务端向客户端推送的模式,如果自己写的socket到时顺理成章的很容易实现。但是,甲方要我们用标准的http协议。当然,自己写http服务器倒是也没什么题,我开始也时这么想的,而且都设计好了分布计算和负载平衡的方式。但有人暂时还建议我们用中间件,他们的意见就像天气的脸,一会儿这样,一会儿那样。于是在这方面考虑,无奈和喜悦同时而生。无奈的是,直接应用中间件,成就感将大打折扣。喜悦的是,直接应用中间件,我的开发量几乎可以说就是实现商业逻辑,分布计算和负载平衡都可以配置中间件实现。

 

那么如果用中间件写http服务,来应付客户端的请求并实现推送模式呢。在开会的时候, 一个同事使我猛醒。他说他就直接写一个servlet,这就是标准的http服务。这时,我便想起了我曾写过用java中URL累实现的http客户端。不妨用之,这样服务端客户端就都有了试验的依据。其中我问及同事是否实现长连接,结果他说没有 (应该是没想到这点),但是我们知道,服务推送的模式每次都打开和关闭与客户端的连接必然很耗资源。而我们实现的系统就是具备长连接,而且很耗带宽的连接,不管是长连接还是短连接。如果每次数据传送都要建立连接,而且请求非常频繁的假推送模式效能很低的话,我们就可以试一试长连接推送的方式。

 

也许你会想,servlet的长连接怎么实现呢。不错,用while循环就可以了。平常我们用浏览器浏览网页,大都一次请求,然后得到结果,关闭连接。其实如果服务端用一个死循环,一直在发送数据,而且客户端没有关闭的话,连接是一直存在的。我们完全可以用这条连接实现服务推模式。当然,监听的客户端自己写一个很简单,如下:

package test;

import java.io.InputStream;
import java.net.URL;

public class LongConnectionClient {
	
	public static void main(String args[]) {
		try {
			
			//确定服务地址
		    URL url = new URL("http://localhost:8080/HttpConnectionTest/LongConnectionTest");
		    InputStream in=url.openStream();
		    int n = -1;
		    byte[] b = new byte[1024];
		    //从服务端读取数据并打印
		    while((n=in.read(b))!=-1)
            {
                String s=new String(b,0,n, "UTF-8");
                System.out.println(s);    
            }
		    
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 服务端的代码也异常简单:

package test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 public class LongConnectionTest extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
	public LongConnectionTest() {
		super();
	}   	
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}  	
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		 response.setCharacterEncoding("UTF-8");
		 response.setContentType("text/html");
		
         PrintWriter pr = response.getWriter();
         
         try {
	         while(true) {
	             pr.print("有时候你不得不相信");
	             //flush的作用很重要,当你任务写给客户端的数据总够多的时候
	             //调用之,客户端方能读取到。
	             //否则,在数据长度达到上限或者连接关闭之前,客户端读不到数据
	             pr.flush();
	             Thread.sleep(500);
	         }
         } catch(Exception e) {
        	 e.printStackTrace();
         }
		
	}   	  	    
}

 

好了,把这个servlet部署到你的servlet引擎,就可以尝试这个其实很简单,但是大多都不去往这方面想的servlet用法。

 

我的测试环境是jdk1.5,tomcat6.0。仅此而已。

分享到:
评论
1 楼 爱老虎哟 2012-05-22  
额,确实。但如果用ajax在客户端请求的话,好像就不起作用了呢

相关推荐

    应用Servlet实现购物车

    综上所述,应用Servlet实现购物车功能涉及到了会话管理、请求处理、数据库交互、页面跳转、视图渲染以及多种业务操作。理解并掌握这些知识点,对于开发Java Web应用程序是非常重要的。通过实践,开发者可以更好地...

    servlet实现的mysql数据库连接增删查改

    这样,你就可以通过Servlet实现与MySQL数据库的连接并执行CRUD操作了。请记住,始终确保对数据库操作进行适当的安全检查和验证,避免SQL注入等安全问题。此外,为了提高性能和可维护性,可以考虑使用连接池(如C3P0...

    使用servlet实现简单用户登录

    总的来说,"使用servlet实现简单用户登录"是一个基础的Web开发实践,它涵盖了Servlet、JSP和数据库交互的基础知识。通过这个项目,开发者可以学习到如何处理HTTP请求,建立数据库连接,以及如何在Web应用中实施基本...

    servlet实现增删改查

    在Java Web开发中,Servlet是...总结,使用Servlet实现增删改查涉及了HTTP请求处理、数据库操作、响应生成等多个环节,是理解Web应用开发的关键步骤。通过这个项目,初学者能够学习到如何在实际环境中运用Servlet技术。

    servlet登陆界面,连接数据库

    在Java Web应用中,Servlet主要负责处理HTTP请求,生成响应,并返回给客户端。当用户通过浏览器访问一个Servlet时,服务器会创建Servlet实例并调用其服务方法。 二、Servlet生命周期 Servlet的生命周期包括加载、...

    servlet实现购物车功能

    在开发Web应用时,"Servlet实现购物车功能"是一个常见的需求,主要涉及到用户交互、数据存储和业务逻辑处理。在这个场景中,我们使用了Servlet、JSTL(JavaServer Pages Standard Tag Library)、JSP(JavaServer ...

    servlet实现登录动能

    综上所述,"Servlet实现登录功能"项目涵盖了Servlet的基本使用、请求响应处理、表单数据验证、会话管理、数据库交互及安全防范等多个重要方面,是Java Web开发中的典型应用场景。通过这个项目,开发者可以深入理解...

    纯Servlet实现用户管理系统(入门实例,深刻认识Servlet)

    本实例以“纯Servlet实现用户管理系统”为主题,旨在帮助初学者深入理解Servlet的工作原理及其在实际应用中的使用。在这个入门教程中,我们将探讨如何利用Servlet和JDBC(Java Database Connectivity)技术来构建一...

    servlet实现增删查找功能

    通过Servlet实现增删改查(CRUD,Create-Read-Update-Delete)功能,是Web开发中的常见任务。接下来,我将详细解释在实现这一功能时所涉及的知识点。 首先,模型(Model)通常指的是应用程序中用于表示数据和业务...

    servlet实现登录注册等源码

    在本项目"Servlet实现登录注册等源码"中,我们看到的是一个基于Servlet、MySQL数据库和JDBC(Java Database Connectivity)的技术栈来构建的用户管理功能,包括用户注册、登录以及可能的个人资料更新(如上传头像)...

    jsp+servlet+jdbc原生实现增删改查两张表

    在项目的压缩包中,"两张表员工管理录入jspServlet"可能包含了两个数据库表的JSP页面和Servlet实现,一个用于员工信息,另一个可能是其他相关数据,比如部门信息。每个页面都可能有对应的添加、编辑、删除和查看操作...

    servlet实现学生信息管理系统源码

    在本项目中,"servlet实现学生信息管理系统源码"是一个使用Java编程语言开发的Web应用程序,主要目标是实现对学生信息的高效管理。这个系统基于Servlet技术,它是一种用于构建动态Web应用的标准Java API,提供了...

    JAVA聊天室servlet实现

    在这个"JAVA聊天室servlet实现"项目中,我们将深入探讨如何使用Java Servlet构建一个简单的在线聊天室。 首先,理解Servlet生命周期是至关重要的。Servlet的生命周期包括加载、初始化、服务和销毁四个阶段。在初始...

    jsp+Servlet实现简单的登陆

    本示例探讨的是如何使用这两种技术来实现一个简单的登录功能,这是一个基础但关键的功能,对于任何Web应用程序来说都是必不可少的。 首先,让我们深入了解一下Servlet。Servlet是Java编写的小型服务器端程序,它...

    servlet实现 网上商品信息查询

    总结,"servlet实现网上商品信息查询"涉及的技术点主要包括Servlet生命周期、HTTP请求处理、数据库连接与查询、数据传输格式(HTML/JSON)、以及可能的模板引擎或JSON序列化库的使用。`shopDB.accdb`是Access数据库...

    jsp与servlet实现购物车

    这个简单的购物车项目是理解JSP和Servlet协作的好例子,它展示了如何在Web应用程序中实现用户交互、处理业务逻辑和存储状态。随着技术的发展,现代Web框架如Spring MVC或Spring Boot已经提供了更高级的抽象,但了解...

    jsp+servlet实现用户注册

    总的来说,"jsp+servlet实现用户注册"项目涵盖了Web开发中的关键技术,包括前后端交互、数据验证、数据库操作以及安全性考虑。通过学习和实践这样的项目,开发者可以深入理解Web应用的工作原理,并提升自己的开发...

    servlet包以及连接数据库的包

    Servlet包和连接数据库的包是Java Web开发中的关键组成部分,它们为构建动态、交互式的Web应用程序提供了基础。在本文中,我们将深入探讨Servlet技术以及它如何与数据库进行交互。 Servlet是Java Servlet API的核心...

    Servlet实现简单购物车

    【Servlet实现简单购物车】 Servlet是Java Web开发中的一个核心组件,主要用于处理HTTP请求和响应。在本项目中,"Servlet实现简单购物车"是指利用Servlet技术来构建一个基础的在线购物车系统。这个系统可能包括添加...

    Servlet实现增删改查demo

    在本"Servlet实现增删改查demo"中,我们将探讨如何使用Servlet来完成基本的数据操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete),这些是任何数据管理应用的核心功能。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics