当前位置:编程学习 > JAVA >>

关于web服务器内部如何实现ajax调用的问题

谁有过自己实现一个web服务器的经验?
现在我想自己实现一个web服务器,要求能支持普通的请求(请求网页)和ajax请求。现在代码能够实现web服务器最基本的功能,就是请求一个文件,然后返回文件的内容。也可以请求一个目录,返回目录中文件列表。
现在我想用ajax来调用后台函数。
但是ajax调用总是不成功。
请求调用普通文件的时候,给请求发送返回数据,是使用socket的getOutputStream,得到其输出流,得到这个输出流之后,向其中写入要返回的东西。请问ajax要怎么实现返回数据给请求的客户端呢(现在实现的代码虽然对于普通请求能正常,但是对于ajax却错误。所以ajax请求的返回,应该不是按照得到socket的getOutputStream来发送数据给请求方的吧???)。
web服务 ajax socket --------------------编程问答--------------------
您查询的关键词是:ajaxhttp 。如果打开速度慢,可以尝试快速版;如果想保存快照,可以添加到搜藏;如果想更新或删除快照,可以投诉快照。
(百度和网页http://www.cnblogs.com/huashanlin/archive/2006/10/09/524707.html的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。)

桦山涧
Asp.net ---->知识改变命运!
导航

    博客园
    首页
    新随笔
    联系
    订阅订阅
    管理

统计

    随笔 - 253
    文章 - 3
    评论 - 142
    引用 - 6

公告
AJAX之HTTP协议基础
  要很好地领会Ajax技术的关键是了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特网上在浏览器与服务器间传输的其他类型文件。只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息。(大部分浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子。)

  注意:本文中只涉及HTTP协议,这是Ajax开发人员关心的方面,它可作为HTTP的参考手册或指南。

  HTTP由两部分组成:请求和响应。当你在Web浏览器中输入一个URL时,浏览器将根据你的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)的数据。直到浏览器解析该响应并显示出网页(或其他资源)为止。

  HTTP请求

  HTTP请求的格式如下所示:

<request-line>
<headers>
<blank line>
[<request-body>]

  在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。

  在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。对于www.wrox.com的GET请求如下所示:

GET / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

  请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。

  第2行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。

  如果要获取一个诸如http://www.wrox.com/books的www.wrox.com域内的页面,那么该请求可能类似于:

GET /books/ HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

  注意只有第一行的内容发生了变化,它只包含URL中www.wrox.com后面的部分。

  要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:

URL ? name1=value1&name2=value2&..&nameN=valueN

  该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:

GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

  注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)。“名称—值”(name—value)对用 & 隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。

  浏览器发送的首部,通常比本文中所讨论的要多得多。为了简单起见,这里的例子尽可能简短。

  另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。

  以下就是一个典型的POST请求:

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

  从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User-Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。

  正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。

  HTTP响应

  如下所示,HTTP响应的格式与请求的格式十分类似:

<status-line>
<headers>
<blank line>
[<response-body>]

  正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

  在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:

  ◆200 (OK): 找到了该资源,并且一切正常。

  ◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

  ◆ 401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。

  ◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。

  ◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

  在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

  注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。

posted on 2006-10-09 23:16 桦林 阅读(321) 评论(1) 编辑 收藏
刷新评论刷新页面返回顶部
博客园首页博问新闻闪存程序员招聘知识库

Powered by:
博客园
Copyright © 桦林
--------------------编程问答--------------------
引用 1 楼 abcmsnet 的回复:
您查询的关键词是:ajaxhttp 。如果打开速度慢,可以尝试快速版;如果想保存快照,可以添加到搜藏;如果想更新或删除快照,可以投诉快照。
(百度和网页http://www.cnblogs.com/huashanlin/archive/2006/10/09/524707.html的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。)

桦山涧
Asp.ne……


读了一遍。对我的问题没什么帮助。不过还是感谢帮顶。 --------------------编程问答-------------------- 可能是楼主给的信息太少,也可能是我理解不足。
难道对于服务端来说,它还区分这个请求是ajax请求或者是其他请求吗?感觉都一样吧! --------------------编程问答-------------------- 1楼完全不靠谱  粘怎么多没杀意义 
我只能说如果你想服务器内部调用的话 
如果不用ajax的话 我想线程是个不错的方法 --------------------编程问答-------------------- 用jquery的$.ajax()方法就可以啊 --------------------编程问答-------------------- 小白,HTTP普通请求跟ajax请求本质都是一样的吧,只是一个是同步一个是异步的,后台都是做请求响应处理,数据流可以到前面就看你怎么处理了,我觉得ajax错误可能是你那个代码的问题,你要不把异步请求贴出来看看吧。 --------------------编程问答--------------------
引用 3 楼 duxingzhe0311 的回复:
可能是楼主给的信息太少,也可能是我理解不足。
难道对于服务端来说,它还区分这个请求是ajax请求或者是其他请求吗?感觉都一样吧!

我现在是实现了一个简单的http服务器。但是ajax调用需要更高层的协议,不仅仅是http服务器了。 --------------------编程问答--------------------
引用 4 楼 Think_Java_1993 的回复:
1楼完全不靠谱  粘怎么多没杀意义 
我只能说如果你想服务器内部调用的话 
如果不用ajax的话 我想线程是个不错的方法

是我描述的不太清楚吧。我现在想做的就是自己实现一个能让浏览器发送ajax调用的服务器。类似tomcat。不知有什么好的建议没?现在仅仅实现了一个简单的http服务器。还不知道下一步怎么做。 --------------------编程问答-------------------- 更高层的协议是什么协议? --------------------编程问答--------------------
引用 6 楼 linchuqun8384 的回复:
小白,HTTP普通请求跟ajax请求本质都是一样的吧,只是一个是同步一个是异步的,后台都是做请求响应处理,数据流可以到前面就看你怎么处理了,我觉得ajax错误可能是你那个代码的问题,你要不把异步请求贴出来看看吧。

HTTP普通请求跟ajax请求本质都是一样的吧。
你这句话本身是没问题的。可能是我描述的有问题。
我需要用ajax来调用action的。也就是,我需要实现一个简单的servlet容器。 --------------------编程问答--------------------
引用 9 楼 duxingzhe0311 的回复:
更高层的协议是什么协议?

不对。刚刚查了下。ajax也完全是基于http协议的。没有其他什么协议了。
我思路还不是很清楚。
我需要用ajax来调用action 的。所以我现在应该是需要实现一个简单的servlet容器。 --------------------编程问答-------------------- 楼主的精神值得学习,有一本书《how tomcat works》,不知道楼主看过木有,里面应该会讲怎么实现web服务器的。
这本书我刚买,买的中文版的。才看个开头,感觉还不错。呵呵! --------------------编程问答--------------------
引用 11 楼 naughty610 的回复:
引用 9 楼 duxingzhe0311 的回复:更高层的协议是什么协议?
不对。刚刚查了下。ajax也完全是基于http协议的。没有其他什么协议了。
我思路还不是很清楚。
我需要用ajax来调用action 的。所以我现在应该是需要实现一个简单的servlet容器。



全是 http协议模式  包括Jquery

只是对原来http请求做的封装而已 简化调用

至于ajax与serlvet、action什么的都没关系 

它只需要一个能够拿到数据的url 哪怕你只是一个工程中的文件

--------------------编程问答-------------------- ajax,也是调用的servlet吧,用servlet,应当可以解决。 --------------------编程问答-------------------- ajax是个技术名词实现底层HTTP协议,你想搞清楚ajax在后做了什么才成功访问了servlet,那你就使用工具去分析它HTTP协议所做的工作.使用httpanalyzer抓取ajax的信息头 --------------------编程问答--------------------
引用 15 楼 abcmsnet 的回复:
ajax是个技术名词实现底层HTTP协议,你想搞清楚ajax在后做了什么才成功访问了servlet,那你就使用工具去分析它HTTP协议所做的工作.使用httpanalyzer抓取ajax的信息头



引用 12 楼 duxingzhe0311 的回复:
楼主的精神值得学习,有一本书《how tomcat works》,不知道楼主看过木有,里面应该会讲怎么实现web服务器的。
这本书我刚买,买的中文版的。才看个开头,感觉还不错。呵呵!
这本书我看了一点。写的确实不错。 --------------------编程问答--------------------
引用 13 楼 Tz_Sword 的回复:
引用 11 楼 naughty610 的回复:引用 9 楼 duxingzhe0311 的回复:更高层的协议是什么协议?
不对。刚刚查了下。ajax也完全是基于http协议的。没有其他什么协议了。
我思路还不是很清楚。
我需要用ajax来调用action 的。所以我现在应该是需要实现一个简单的servlet容器。


全是 http协议模式  包括Jquery……


hi。我现在部署了一个apache作为http服务器。然后想用ajax来调用localhost:80,但是从firebug中看,调用是不成功的。请问知道是咋回事吗? --------------------编程问答--------------------
引用 14 楼 zhanghua4109 的回复:
ajax,也是调用的servlet吧,用servlet,应当可以解决。


ajax调用servlet确实可以。但是我现在项目不让用web服务器。想用的话只能自己模拟一个。自己模拟一个http服务器还可以。如果是servlet服务器,太复杂了。

现在想一些折中的办法。想通过ajax访问http服务器的文件。但是访问一直失败。 --------------------编程问答-------------------- 写监听对外开发接口 --------------------编程问答-------------------- 多查点资料吧 --------------------编程问答-------------------- 支持19L
    Socket编程+线程 ,使用监听。 --------------------编程问答-------------------- 可以使用这样的方法:
使用ajax请求http服务器上的文件。把文件作为中转。
我是用的下面这个方法:
自己实现了一个http server。在http server处理请求的时候,按照自己的实现,返回一个自己需要的json数据就ok了。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,