没有合适的资源?快使用搜索试试~ 我知道了~
javasocket服务器给浏览器发信息.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 189 浏览量
2022-07-14
14:04:07
上传
评论
收藏 358KB PDF 举报
温馨提示
试读
30页
javasocket服务器给浏览器发信息.pdf
资源推荐
资源详情
资源评论
Java Socket 现实简单的 HTTP服务
一个简单的用 Java Socket 编写的 HTTP 服务器应用 , 演示了请求和应答的协
议通信内容以及给客户端返回 HTML 文本和二进制数据文件 ( 一个图片 ), 同时
展示了 404, 200 等状态码 .
首先运行这个程序 , 然后打开 Web浏览器 , 键入 http://localhost, 则这个程序能
够显示出浏览器发送了那些信息并且向浏览器返回一个网页和一副图片 , 并测
试同浏览器对话 . 当浏览器看到 HTML 中带有图片地址时 , 则会发出第二次连
接来请求图片等资源 . 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基
于 J2SE 的 Socket 等软件编写的概念 , 并熟悉 HTTP 协议 . 相反的用
Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返
回内容 .
当用户在 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( 用户的浏览器信息 ) 等. 在请求消息的报头行之后是一个回
车换行 , 表明请求消息的报头部分结束 . 在这个之后是请求消息的消息实体
(Entity Body). 具体的例子参看 httpRequest.txt.
Web服务器在收到客户请求并作出处理之后 , 要向客户发送应答消息 . 与请求消
息一样 , 应答消息的语法规则为 :
< HTTP Version> <Status Code> [<Message>]<>
{ <Header>:<Value> <> }
<\r\n>
{ Entity Body }
应答消息的第一行为状态行 , 其中包括了 HTTP版本号 , 状态码和对状态码进行简
短解释的消息 ; 状态行的最后是回车换行 . 状态码由 3 位数字组成 , 有 5 类:
参看:HTTP应答码及其意义
1XX 保留
2XX 表示成功
3XX 表示 URL已经被移走
4XX 表示客户错误
5XX 表示服务器错误
例如 :415, 表示不支持改媒体类型 ;503, 表示服务器不能访问 . 最常见的是 200,
表示成功 . 常见的报头有 :Last_Modified( 最后修改时间 ),Content_Type( 消息内
容的 MIME类型 ),Content_Length( 内容长度 ) 等.
在报头行之后也是一个回车换行 , 用以表示应答消息的报头部分的结束 , 以及应
答消息实体的开始 .
下面是一个应答消息的例子 :
HTTP/1.0 200 OK
Date: Moday,07-Apr-97 21:13:02 GMT
Server:NCSA/1.1
MIME_Version:1.0
Content_Type:text/html
Last_Modified:Thu Dec 5 09:28:01 1996
Coentent_Length:3107
<HTML><HEAD><TITLE></HTML>
在用 Java 语言实现 HTTP服务器时 , 首先启动一个 java.net.ServerSocket 在提
供服务的端口上监听连接 . 向客户返回文本时 , 可以用 PrintWriter, 但是如果返
回二进制数据 , 则必须使用 OutputStream.write(byte[]) 方法, 返回的应答消息
字符串可以使用 String.getBytes() 方法转换为字节数组返回 , 或者使用
PrintStream 的 print() 方法写入文本 , 用 write(byte[]) 方法写入二进制数
据.
源程序来自 http://blog.csdn.net/myeclipse_java ,本程序是在原有
基础上进行了一些调整,源程序在 POST请求时会阻塞,本程序解决了
此问题,另外,本程序在原有的基础上增加了文件上传与下载模拟功能:
Java 代码
import java.io.File;
import java.io.FileInputStream;
1. import java.io.IOException;
2. import java.io.InputStream;
3. import java.io.PrintStream;
4. import java.io.PrintWriter;
5. import java.net.ServerSocket;
6. import java.net.Socket;
7. import java.net.URLDecoder;
8. import java.util.ArrayList;
9. import java.util.StringTokenizer;
10.
11./**
12. *
13. * @author 刘长炯
14. * modi by jzj
15. *
16. */
17.public class SimpleHttpServer implements Runnable {
18.
19. ServerSocket serverSocket;// 服务器 Socket
20.
21. public static int PORT = 80;// 标准 HTTP端口
22.
23. public String encoding = "GBK";
24.
25. public SimpleHttpServer() {
26. try {
27. serverSocket = new ServerSocket(PORT);
28. } catch (Exception e) {
29. e.printStackTrace();
30. System.exit( 1);
31. }
new Thread(this).start();
System.out.println("HTTP 服务器正在运行 , 端
口:" + PORT);
32. }
33.
34. public void run() {
35. while (true) {
36. try {
37. Socket client = serverSocket.accept();// 客户机 ( 这
里是 IE 等浏览器 ) 已经连接到当前服务器
38. if (client != null) {
39. System.out.println(" 连接到服务器的用
户:" + client);
40. try {
41. // 第一阶段 : 打开输入流
42. InputStream is = client.getInputStream();
43.
44. System.out.println(" 客户端发送的请求信
息: >>>>>>>>>>>>>>>>>>>>>>>>>");
45. // 读取第一行 , 请求地址
46. String line = readLine(is, 0);
47. // 打印请求行
48. System.out.print(line);
49. // < Method > < URL > < HTTP Version > <\r
\n> 取的是 URL部分
50. String resource = line.substring(line.inde
xOf('/'), line
51. .lastIndexOf('/') - 5);
52. // 获得请求的资源的地址
53. resource = URLDecoder.decode(resource, enc
oding);// 反编码 URL 地址
54. String method = new StringTokenizer(line).
nextElement()
55. .toString();// 获取请求方
法, GET 或者 POST
56. int contentLength = 0;// 如果为 POST方法,则
会有消息体长度
57.
58. // 读取所有浏览器发送过来的请求参数头部信
息
59. do {
60. line = readLine(is, 0);
61. // 如果有 Content-Length 消息头时取出
62. if (line.startsWith("Content-Length"))
{
63. contentLength = Integer.parseInt(l
ine.split(":")[ 1]
64. .trim());
65. }
66. // 打印请求部信息
67. System.out.print(line);
68. // 如果遇到了一个单独的回车换行,则表示
请求头结束
69. } while (!line.equals("\r\n"));
70. // 如果是 POST请求,则有请求体
71. if ("POST".equalsIgnoreCase(method)) {
72. // 注,这里只是简单的处理表单提交的参数,
而对于上传文件这里是不能这样处理的,
73. // 因为上传的文件时消息体不只是一行,会
有多行消息体
74. System.out.print(readLine(is, contentL
ength));
75. System.out.println();
76. }
77.
78. System.out.println(" 客户端发送的请求信息结
束 <<<<<<<<<<<<<<<<<<<<<<<<<<");
79. System.out.println(" 用户请求的资源
是:" + resource);
80. System.out.println(" 请求的类型
是: " + method);
81. System.out.println();
82.
83. // 如果是下载文件
84. if (resource.startsWith("/download")) {
85. fileDownload("test.txt", client);
86. closeSocket(client);
87. continue;
88. }
89.
90. // GIF 图片就读取一个真实的图片数据并返回
给客户端
91. if (resource.endsWith(".gif")) {
92. imgDownload("test.gif", client);
剩余29页未读,继续阅读
资源评论
yyc13139216118
- 粉丝: 2
- 资源: 6万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功