`
haiyupeter
  • 浏览: 427490 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java套接字处理

    博客分类:
  • Java
阅读更多

HTTP 头部详解及使用 Java 套接字处理 HTTP 请求

 

进行 Web 开发关键是要了解超文本传输协议( HTTP ),该协议用来传输网页图像以及因特网上在浏览器与服务器间传输的其他类型文件只要你在浏览器上输入一个 URL ,最前面的 http:// 就表示使用 HTTP 来访问指定位置的信息(大部分浏览器还支持其他一些不同的协议,其中 FTP 就是一个典型例子)

 

本文从 HTTP 协议的结构上初步探讨 HTTP 协议的工作原理和请求响应格式 , 并最后通过一个使用 Java 编写的小 HTTP 服务器验证了如何处理和响应 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 编码和解码,这些将在本章中的后续部分中说明)名称值( namevalue )对用   &  隔开绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式当然,如何使用这些数据还是由服务器决定的

 

 

 

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

 

 

 

另一方面, 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 源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)浏览器将把这些数据显示给用户

 

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

 

附录 : 使用 Java 套接字实现一个可以处理 get post 请求的小 HTTP 服务器程序

 

 

 

/** *//**

  * SimpleHttpServer.java

  */

 

import java.io.*;

import java.net.*;

import java.util.StringTokenizer;

 

/** *//**

  *  一个简单的用   Java Socket  编写的   HTTP  服务器应用 ,  演示了请求和应答的协议通信内容以及

  *  给客户端返回   HTML  文本和二进制数据文件 ( 一个图片 ),  同时展示了   404, 200  等状态码 .

  *  首先运行这个程序 , 然后打开 Web 浏览器 , 键入 http://localhost, 则这个程序能够显示出浏览器发送了那些信息

  *  并且向浏览器返回一个网页和一副图片 ,  并测试同浏览器对话 .

  *  当浏览器看到   HTML  中带有图片地址时 ,  则会发出第二次连接来请求图片等资源 .

  *  这个例子可以帮您理解   Java    HTTP  服务器软件是基于   J2SE    Socket  等软件编写的概念 ,  并熟悉

  * HTTP  协议 .

  *  相反的用   Telnet  连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容 .

  *

  * <pre>

  *        当用户在 Web 浏览器地址栏中输入一个带有 http:// 前缀的 URL 并按下 Enter , 或者在 Web 页面中某个以 http:// 开头的超链接上单击鼠标 ,HTTP 事务处理的第一个阶段 -- 建立连接阶段就开始了 .HTTP 的默认端口是 80.

  *     随着连接的建立 ,HTTP 就进入了客户向服务器发送请求的阶段 . 客户向服务器发送的请求是一个有特定格式的 ASCII 消息 , 其语法规则为 :

  * < Method > < URL > < HTTP Version > < >

  * { <Header>:<Value> < >}*

  * < >

  * { Entity Body }

  *     请求消息的顶端是请求行 , 用于指定方法 ,URL HTTP 协议的版本 , 请求行的最后是回车换行 . 方法有 GET,POST,HEAD,PUT,DELETE .

  *  在请求行之后是若干个报头 (Header) . 每个报头行都是由一个报头和一个取值构成的二元对 , 报头和取值之间以 ":" 分隔 ; 报头行的最后是回车换行 . 常见的报头有 Accept( 指定 MIME 媒体类型 ),Accept_Charset( 响应消息的编码方式 ),Accept_Encoding( 响应消息的字符集 ),User_Agent( 用户的浏览器信息 ) .

margin: 0px; padding: 0px; l

分享到:
评论

相关推荐

    Socket套接字—Java套接字编程

    本文将深入探讨Java套接字编程的相关知识点,包括Socket和ServerSocket的使用、数据传输、异常处理以及实际应用中的常见问题。 1. **Socket类**:Socket代表了TCP连接中的一个端点,它允许应用程序通过网络发送和...

    Java 套接字编程Java 套接字编程

    ### Java套接字编程详解 #### 一、引言 随着互联网技术的不断发展与普及,网络编程成为现代软件开发中不可或缺的一部分。Java作为一种广泛应用的编程语言,提供了丰富的API支持网络编程,尤其是对于套接字(Socket)...

    java套接字聊天

    总结,Java套接字聊天涉及到网络编程基础、多线程、数据传输与序列化、异常处理以及可能的安全措施。理解并熟练掌握这些知识点是开发类似应用的关键。通过`chat_socket_client`和`chat_socket_server`代码的学习和...

    一个经典的java 套接字传输范例

    Java套接字(Socket)是网络编程中的基本概念,它为两台计算机之间的通信提供了低级别的接口。在Java中,套接字允许客户端应用程序连接到服务器,并通过网络发送和接收数据。下面,我们将深入探讨Java套接字传输的...

    Java套接字编程

    ### Java套接字编程详解 #### 一、Java网络编程概览 Java作为一种全面支持网络功能的编程语言,其强大的网络编程能力主要归功于它的一系列网络API,特别是位于`java.net`和`javax.net`包中的API。这些API为开发者...

    socket 套接字 Java 套接字 编程

    Java套接字编程是网络通信的核心技术之一,主要用于实现客户端与服务器之间的数据交换。本文将深入探讨Java中的Socket编程,包括基本概念、工作原理、创建和使用Socket的过程,以及常见问题和解决策略。 1. 基本...

    基于Java的Socket套接字编程 源代码

    文件名“Socket套接字—Java套接字编程上1”可能暗示了这是一个系列教程的第一部分,涵盖了基础知识和简单的客户端-服务器交互。实际源码可能包括客户端如何发起连接、发送数据,以及服务器如何监听、接收数据和响应...

    java套接字编程笔记

    Java套接字编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在Java中,套接字(Socket)是实现客户端-服务器模型通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。这篇笔记将...

    java 套接字

    Java套接字是Java网络编程的核心组件,它提供了一种在不同网络节点间进行通信的机制。...在实际开发中,理解TCP/IP原理、熟悉Java套接字的使用,以及掌握异常处理和多线程编程,对于构建健壮的网络服务至关重要。

    聊天室代码 套接字 java

    【标题】:“聊天室代码 套接字 java” 【描述】:“java 聊天室代码 套接字很简单 适合于初级者” 在Java编程中,创建一个简单的聊天室涉及到网络通信的核心概念——套接字(Socket)。套接字是网络编程的基本...

    java的套接字编程 简单的QQ

    下面将详细讲解Java套接字编程的核心概念、原理以及如何应用于这个简单QQ的实现。 1. **Java套接字基础** Java套接字是Java网络编程的基础,分为ServerSocket和Socket两种类型。ServerSocket是服务器端使用的,...

    java中socket套接字定义与使用

    总的来说,Java中的Socket套接字是实现网络通信的核心工具,无论是基于TCP的稳定传输还是UDP的高效传输,都能通过Socket灵活地构建网络应用。在实际开发中,开发者应根据应用的需求和场景选择合适的通信协议,以实现...

    Socket套接字—Java套接字编程(上1).rar_socket_套接字_套接字 Java

    总结起来,Java套接字编程是构建网络应用的基础,包括了创建ServerSocket来监听连接,使用Socket建立连接并交换数据,以及处理异常和关闭资源的流程。实际应用中,开发者还需要考虑到多线程处理、网络安全、性能优化...

    Java Socket套接字

    Java Socket套接字是Java网络编程中的核心组件,它提供了应用程序之间进行低级通信的机制。...通过阅读提供的"Java套接字socket101"文档,你可以更深入地学习Socket编程的细节,从而更好地掌握这个强大的通信机制。

    Java非阻塞套接字概述

    总结来说,Java非阻塞套接字是Java NIO的重要组成部分,它提供了一种更高效、灵活的网络编程模型,特别适合处理高并发连接。通过非阻塞套接字,开发者可以编写出无须手动管理线程的服务器端程序,同时利用Selector...

    java聊天 socke套接字

    Java聊天程序基于Socket套接字实现,是一种基础的网络通信技术,主要用于客户端和服务器之间的数据交互。在Java中,Socket类代表一个网络连接,而ServerSocket类用于监听和接受来自客户端的连接请求。本教程适合Java...

    java套接字记事本文件学习

    3. **异常处理**:在Java套接字编程中,网络通信可能出现各种异常,如IOException,需要进行适当的异常捕获和处理。 4. **流的读写**:学会使用InputStream和OutputStream进行字节流的读写操作,包括字节、字符串和...

    套接字数据库查询----java期末考试

    在Java编程领域,套接字(Socket)是网络通信的核心组件,它允许两个网络应用程序之间进行双向通信。在“套接字数据库查询”这个主题中,我们主要关注如何使用Java的套接字技术来实现远程数据库查询。在这个期末考试...

    利用Java套接字实现应用程序间的数据通信

    ### 利用Java套接字实现应用程序间的数据通信 #### 一、套接字的概念 在计算机网络中,**套接字**(Socket)是一种在不同应用程序之间建立通信的机制。简单来说,套接字可以被视为两个程序进行通信的一个端点。一...

Global site tag (gtag.js) - Google Analytics