为了实现服务端向客户端推送的模式,如果自己写的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加jsp的程序,实现用户注册登陆,有完整代码加逻辑。可以实现数据库连接,比较简单。
Java Web,简单的应用Ajax+servlet实现的输入、搜索的提示效果,简单修改连接数据库就可以实现更加智能的提示效果
实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用 实验二 JSF+JPA实现用户注册 实验三 struts+spring+hibernate框架访问数据库的应用 实验四 使用WebService和EJBean访问数据库的应用
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义...
该博客系统是一个基于Servlet技术开发的Web应用,旨在提供一个简单而功能完备的博客平台。用户可以注册账户、发布博客文章。整个系统使用Java Servlet技术作为后端处理逻辑,并采用MVC(Model-View-Controller)架构...
6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...
6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...
11. 3 Applet和Servlet之间实现远程方法调用 11. 3. 1 远程方法调用中的设计模式 11. 3. 2 设计应用程序子协议 11. 3. 3 远程方法调用的实例 第12章 在Servlet中发送和接收邮件 12. 1 电子邮件协议 12. 2 利用...
6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...
java web从入门到精通配套源代码,《Java Web从入门到精通》介绍如何整合Web框架进行J2EE开发,所有实例都基于MyEclipse IDE开发,引领读者快速进入基于JaVa web的J2EE应用领域。《Java Web从入门到精通》开始主要...
Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化,在这一过程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。 在初始化过程中,javax.servlet.Servlet接口的init()...
6.1.2 servlet相关接口与实现类 197 6.2 几个实例 205 6.2.1 实例一:simplehello 205 6.2.2 实例二:welcomeyou 210 6.2.3 实例三:outputinfo 216 6.2.4 实例四:loginservlet 220 6.3 servlet异常 223 ...
第7章 用JSP实现常见的Web应用 7.1 常见的Web应用及分析 7.1.1 留言板、论坛和社区 7.1.2 聊天室 7.1.3 搜索引擎 7.1.4 电子商务 7.1.6 后台管理系统 7.2 留言板 7.2.1 功能分析 7.2.2 功能实现和技术要点 ...
随着计算机网络技术发展,Web数据库技术已经成为应用最为广泛的网站架构基础技术在应用系统中,Web提供了与用户进行通信联络的有效手段,利用Web技术,实现Web服务器与数据库系统的连接,完成对数据的处理与查询,用户可以...
Servlet是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一...
在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设学生信息管理系统设计。 本设计主要实现集人性化、高效率、便捷等优点于一身的学生信息管理系统设计,完成超级管理员、首页、校内公告管理、教师信息...
18.4 通过jdbc连接来测试数据库 18.5 建立music表 第19章 html表单的创建和处理 19.1 html表单如何传输数据 19.2 form元素 19.3 文本控件 19.4 按钮 19.5 复选框和单选按钮 19.6 组合框和列表框 ...
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指...
贴有源码,JSP连接MySql数据库制作的简易的留言板,并附上实验报告
Servlet全称“Java Servlet”,中文意思为小服务程序或服务连接器,是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet...