- 浏览: 425326 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
xiaomuxingren:
你好,请问update-alternatives --inst ...
JDK8安装及jenkins安装 -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket -
晨曦的朝阳:
刚好有需求,学习一下!
MySql主从配置 -
mfkvfn:
这是恶意的商业竞争呀
解决 android 微信5.0及后续版本无法打开电话号码的问题 -
fwyhf:
require('./monitor/module_liste ...
NodeJS Server 进程自动重启
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
发表评论
-
JDK8安装及jenkins安装
2017-11-28 11:48 32561、下载 jdk-8u144-linux-x64.tar.gz ... -
JDK7安装
2017-02-13 16:43 785ppa源安装jdk7的下载链接已经被删除 所以自己安装JDK ... -
记录扫描嗅探与反扫描嗅探的那些事
2016-09-10 10:45 953批量嗅探 1、知道ID为自増如http://www.aa.co ... -
Spring的事务机制
2016-07-13 15:33 465事务原理 原子性 一致性 隔离性 持续性 M ... -
链接加密防篡改方法
2016-06-22 14:51 1552链接加密防篡改方法 对所有参数进行排序,然后尾部加入key参 ... -
学好Java基础的几本书
2011-11-13 20:53 2681学好Java基础的几本书 每一门语言及技术都 ... -
Java 日志管理
2011-06-28 14:59 1655Logger.java //Level.java Log ... -
如何写好Java代码(转载)
2011-03-23 11:50 1502转载自:http://developer.51 ... -
jprofiler使用心得,你不知道的那些事
2010-10-12 08:25 1008听说jprofiler和另一个工具都是可以用来跟踪及检查某Ja ... -
Java动态代理
2010-08-23 15:01 13281.什么是Java动态代理 代理:一种设计模式,其目 ... -
JAVA反射机制
2009-05-13 16:59 919JAVA 反射机制是在运行状态中,对于任意一个类,都能 ... -
类初始化顺序(非常明了)
2009-05-13 16:55 1098超类静态变量. ------------- 超类静态初始化 ... -
jvm指令解析
2009-05-13 16:54 3599//源代码 class TT{ st ... -
Pattern正则表达式
2009-05-13 16:52 1825Pattern (Java 2 Platform SE 6) ... -
正则表达式的四种基本用法
2009-05-13 16:51 1164正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加 ... -
时间格式
2009-05-13 16:51 22181、通过MessageFormat转化 String da ... -
synchronized
2009-05-13 16:49 10811、synchronized的定义 2、sy ... -
invokevirtual,invokespecial,invokestatic,invokein
2009-05-13 16:48 4799invokevirtual,invokespecial,in ... -
jvm的javap 指令及格式
2009-05-13 16:47 2103我们可以看到, 类初始化正是按照源文件中定义的原文顺序 ... -
Java 学习笔记
2009-05-13 16:46 3199推荐几本相当不错的Java书籍:学好 Java基础的几 ...
相关推荐
本文将深入探讨Java套接字编程的相关知识点,包括Socket和ServerSocket的使用、数据传输、异常处理以及实际应用中的常见问题。 1. **Socket类**:Socket代表了TCP连接中的一个端点,它允许应用程序通过网络发送和...
### Java套接字编程详解 #### 一、引言 随着互联网技术的不断发展与普及,网络编程成为现代软件开发中不可或缺的一部分。Java作为一种广泛应用的编程语言,提供了丰富的API支持网络编程,尤其是对于套接字(Socket)...
总结,Java套接字聊天涉及到网络编程基础、多线程、数据传输与序列化、异常处理以及可能的安全措施。理解并熟练掌握这些知识点是开发类似应用的关键。通过`chat_socket_client`和`chat_socket_server`代码的学习和...
Java套接字(Socket)是网络编程中的基本概念,它为两台计算机之间的通信提供了低级别的接口。在Java中,套接字允许客户端应用程序连接到服务器,并通过网络发送和接收数据。下面,我们将深入探讨Java套接字传输的...
### Java套接字编程详解 #### 一、Java网络编程概览 Java作为一种全面支持网络功能的编程语言,其强大的网络编程能力主要归功于它的一系列网络API,特别是位于`java.net`和`javax.net`包中的API。这些API为开发者...
Java套接字编程是网络通信的核心技术之一,主要用于实现客户端与服务器之间的数据交换。本文将深入探讨Java中的Socket编程,包括基本概念、工作原理、创建和使用Socket的过程,以及常见问题和解决策略。 1. 基本...
文件名“Socket套接字—Java套接字编程上1”可能暗示了这是一个系列教程的第一部分,涵盖了基础知识和简单的客户端-服务器交互。实际源码可能包括客户端如何发起连接、发送数据,以及服务器如何监听、接收数据和响应...
Java套接字编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在Java中,套接字(Socket)是实现客户端-服务器模型通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。这篇笔记将...
Java套接字是Java网络编程的核心组件,它提供了一种在不同网络节点间进行通信的机制。...在实际开发中,理解TCP/IP原理、熟悉Java套接字的使用,以及掌握异常处理和多线程编程,对于构建健壮的网络服务至关重要。
【标题】:“聊天室代码 套接字 java” 【描述】:“java 聊天室代码 套接字很简单 适合于初级者” 在Java编程中,创建一个简单的聊天室涉及到网络通信的核心概念——套接字(Socket)。套接字是网络编程的基本...
下面将详细讲解Java套接字编程的核心概念、原理以及如何应用于这个简单QQ的实现。 1. **Java套接字基础** Java套接字是Java网络编程的基础,分为ServerSocket和Socket两种类型。ServerSocket是服务器端使用的,...
总的来说,Java中的Socket套接字是实现网络通信的核心工具,无论是基于TCP的稳定传输还是UDP的高效传输,都能通过Socket灵活地构建网络应用。在实际开发中,开发者应根据应用的需求和场景选择合适的通信协议,以实现...
总结起来,Java套接字编程是构建网络应用的基础,包括了创建ServerSocket来监听连接,使用Socket建立连接并交换数据,以及处理异常和关闭资源的流程。实际应用中,开发者还需要考虑到多线程处理、网络安全、性能优化...
Java Socket套接字是Java网络编程中的核心组件,它提供了应用程序之间进行低级通信的机制。...通过阅读提供的"Java套接字socket101"文档,你可以更深入地学习Socket编程的细节,从而更好地掌握这个强大的通信机制。
总结来说,Java非阻塞套接字是Java NIO的重要组成部分,它提供了一种更高效、灵活的网络编程模型,特别适合处理高并发连接。通过非阻塞套接字,开发者可以编写出无须手动管理线程的服务器端程序,同时利用Selector...
Java聊天程序基于Socket套接字实现,是一种基础的网络通信技术,主要用于客户端和服务器之间的数据交互。在Java中,Socket类代表一个网络连接,而ServerSocket类用于监听和接受来自客户端的连接请求。本教程适合Java...
3. **异常处理**:在Java套接字编程中,网络通信可能出现各种异常,如IOException,需要进行适当的异常捕获和处理。 4. **流的读写**:学会使用InputStream和OutputStream进行字节流的读写操作,包括字节、字符串和...
在Java编程领域,套接字(Socket)是网络通信的核心组件,它允许两个网络应用程序之间进行双向通信。在“套接字数据库查询”这个主题中,我们主要关注如何使用Java的套接字技术来实现远程数据库查询。在这个期末考试...
### 利用Java套接字实现应用程序间的数据通信 #### 一、套接字的概念 在计算机网络中,**套接字**(Socket)是一种在不同应用程序之间建立通信的机制。简单来说,套接字可以被视为两个程序进行通信的一个端点。一...