在一般的B/S程序中(最典型的是web服务)工作的方式是客户端(brower)向服务器端(server)发送一个请求服务器端响应这个请求并发回客户端所请求的数据在这个过程中服务器端扮演的是一个被动响应的角色一般的情况下服务器端是不会主动向客户端写数据的由于HTTP是一个无连接的协议也就是说当服务器端完成对客户端的响应后双方的连接就断开了直到下一次客户端发出请求时再重新建立连接这样的HTTP协议是节省网络资源的但是也给我们带来了一些麻烦比如客户端不能实时探查服务器端的数据变化不能作出及时的响应所以当我们在做一些需要客户端和服务器端互相响应的程序时(比如聊天室web短信息)不得不在客户端不停的刷新页面以求获得最新的数据这样做增加的服务器的负担如果服务器能在数据发生变化的时候主动向客户端写数据那么问题就解决了这就是所谓的推技术
在java中客户端主动向服务器端申请数据叫做拉服务器主动向客户端写数据叫做推我们可以在服务器端打开某个端口监听客户端的连接就可以向客户端随意写数据这是我们做C/S程序的原理推技术采用相同的原理只是客户端是浏览器而已只要我们按照浏览器能够识别的格式向客户端写数据客户端就可以通过HTTP与服务器建立连接并获得数据
HTTP是一个很庞大的协议但是我们只需要用到很小一部分最重要的是要知道按照什么格式写数据浏览器才认识当我们浏览一个网站的某一页比如
wwwsohucom/pagehtm的时候我们是在向服务器发送这样一个信息
GET /pagehtm HTTP/
From: someuser@somehostcom
UserAgent: Mozilla/ (compatible; MSIE ; Windows NT ; DigExt)
空行
其中第一行是我们要关注的它由空格分隔成三部分一是请求的方法(get)二 是请求的页面三是HTTP的版本如果请求无误服务器将返回如下信息
HTTP/ OK
Date: Thu Oct :: GMT
ContentType: text/html
ContentLength:
<html>
<body>
<h>Hello world!</h>
(其他内容)
</body>
</html>
第一行表示连接成果然后是返回数据的属性从开始才是返回给浏览器返回的数据在我们自己的程序中只需要按照上述格式写数据就可以实现一个自己的简易web服务器下面是一个helloworld的例子
import javaio*;
import javanet*;
public class myServer
{
static ServerSocket server=null;
static OutputStreamWriter ow=null;
public static void main(String args[])
{
int port=;
try
{
server=new ServerSocket(port);
}catch(Exception e)
{
Systemoutprintln(e);
}while(true)
{
try
{
Socket socket=serveraccept();
ow=new OutputStreamWriter(socketgetOutputStream());
owwrite(HTTP/ ok );
owwrite(ContentType:text/html );
owwrite();
owwrite(helloworld);
owwrite();
owflush();
socketclose();
}catch(Exception e)
{
Systemoutprintln(e);
}
}
}
}
运行java myServer
然后打开浏览器输入http://localhost:8080将会返回一个helloworld
以上就是一个推技术的简单实现将它扩展一下比如加入多线程响应就可以实现无刷新的聊天室