自己手写http服务器 http响应信息的封装与测试
package cn.edu.sss.httpServer; import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date; //这个类是对http协议返回的封装 public class HttpResponse { public final String CRLF="\r\n";
public final String BLANK=" "; //返回正文的长度
private int len;
//返回状态行和请求头信息
private StringBuilder head; //返回正文内容
private StringBuilder content; //用于写到输出流中
private BufferedWriter bw; private HttpResponse()
{
len=0;
content=new StringBuilder();
head=new StringBuilder(); }
public HttpResponse(Socket s)
{
this();
try {
bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
head=null;
e.printStackTrace();
} } //构建正文
public void print(String s)
{
content.append(s);
len=content.toString().getBytes().length; }
public void println(String s)
{
content.append(s).append(CRLF);
len=content.toString().length(); } /*
private void createHeadInfo(int code){
//1) HTTP协议版本、状态代码、描述
headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
switch(code){
case 200:
headInfo.append("OK");
break;
case 404:
headInfo.append("NOT FOUND");
break;
case 505:
headInfo.append("SEVER ERROR");
break;
}
headInfo.append(CRLF);
//2) 响应头(Response Head)
headInfo.append("Server:bjsxt Server/0.0.1").append(CRLF);
headInfo.append("Date:").append(new Date()).append(CRLF);
headInfo.append("Content-type:text/html;charset=GBK").append(CRLF);
//正文长度 :字节长度
headInfo.append("Content-Length:").append(len).append(CRLF);
headInfo.append(CRLF); //分隔符
}
//推送到客户端
*/
private void createHeader(int code)
{
head.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
switch(code)
{
case 200:
head.append("OK");break;
case 404:
head.append("NOT FOUND"); }
head.append(CRLF);
head.append("Server:tomcat").append(CRLF);
head.append("Date:").append(new Date()).append(CRLF);
head.append("Content-type:text/html;charset=GBK").append(CRLF);
head.append("Content-Length:").append(len).append(CRLF);
head.append(CRLF); }
public void flush(int code) throws IOException
{ createHeader(code);
bw.write(head.toString());
bw.write(content.toString());
bw.flush(); } public static void main(String[] args) {
// TODO Auto-generated method stub } }
HTTP/1.1 OK Server:Apache Tomcat/5.0. Date:Mon,6Oct2003 :: GMT Content-Length:
好了,我们测试一下httpResponse的用法
package cn.edu.sss.httpServer; import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date; public class ServerDemo1 {
public static final String BLANK=" ";
public static final String CRLF="\r\n"; public static void main(String args[]) throws IOException
{
ServerSocket server=new ServerSocket(8088);
Socket socket=server.accept();
byte[] bytes=new byte[20000];
System.out.println(socket.getInetAddress());
int len=socket.getInputStream().read(bytes);
String request=new String(bytes,0,len);
System.out.println(request); HttpResponse response=new HttpResponse(socket);
response.print("<html><head><titilt>你怎么舍得我难过</title>大姑娘美,大姑娘浪</head><body></body></html>");
response.flush(200);//指明响应码 /*
//下面构造响应正文
StringBuilder sbu=new StringBuilder(); sbu.append("<html><head><titilt>你怎么舍得我难过</title>大姑娘美,大姑娘浪</head><body></body></html>");
//
StringBuilder response=new StringBuilder();
response.append("HTTP/1.1").append(BLANK).append("200").append(BLANK).append("OK").append(CRLF);
//响应头
response.append("Server: tomcat").append(CRLF);
response.append("Date").append(new Date()).append(CRLF);
response.append("Content-type:text/html;charset=GBK").append(CRLF);
//正文长度,字节长度
response.append("Content-Length:").append(sbu.toString().getBytes().length).append(CRLF); response.append(CRLF);
//加入正文
response.append(sbu); System.out.println(response); //返回给服务器端 BufferedWriter buf=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
buf.write(response.toString());
buf.flush();;
buf.close();
*/ } }
现在我们测试一下:在浏览器中输入网址
localhost:8088
会返回我们的网页,你可以试试
自己手写http服务器 http响应信息的封装与测试的更多相关文章
- JavaSE 手写 Web 服务器(二)
原文地址:JavaSE 手写 Web 服务器(二) 博客地址:http://www.extlight.com 一.背景 在上一篇文章 <JavaSE 手写 Web 服务器(一)> 中介绍了 ...
- JavaSE 手写 Web 服务器(一)
原文地址:JavaSE 手写 Web 服务器(一) 博客地址:http://www.extlight.com 一.背景 某日,在 Java 技术群中看到网友讨论 tomcat 容器相关内容,然后想到自 ...
- 黑马vue---40、结合Node手写JSONP服务器剖析JSONP原理
黑马vue---40.结合Node手写JSONP服务器剖析JSONP原理 一.总结 一句话总结: 服务端可以返回js代码给script标签,那么标签会执行它,并且可带json字符串作为参数,这样就成功 ...
- 【项目】手写FTP服务器-C++实现FTP服务器
X_FTP_server 手写FTP服务器-C++实现FTP服务器 项目Gitee链接:https://gitee.com/hsby/ftp_Server 简介 一个基于libevent的高并发FTP ...
- 手写Tomcat服务器
预备知识 编写服务器用到的知识点 1) Socket 编程2) HTML3) HTTP 协议4) 反射5) XML 解析6) 服务器编写 Socket编程 https://www.cnblogs.co ...
- 手写Javaweb服务器
简单web服务器 回忆socket 创建客服端(在httpClient_1包下) public class Client { public static void main(String[] a ...
- 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)
在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...
- MiniCat:手写Http服务器
minicat 项目介绍 已实现http基础协议.参数接受.servlet.filter.cookie.多文件上传等.支持NIO. 一款轻量化Http服务器.支持bio.nio两种模式.归属Coody ...
- 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容
写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...
随机推荐
- Hadoop的调度器总结
Hadoop的调度器总结 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇.在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作 ...
- iOS 添加阴影后 屏幕卡顿 抖动
- (void)awakeFromNib { // Initialization code _btnViews.layer.shadowPath =[UIBezierPath bezierPathWi ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- HDU 1429 胜利大逃亡(续)(三维BFS)
题目链接 题意 : 中文题不详述. 思路 : 这个题和1885差不多一样的,所以我直接改了改那个代码就交上了,链接 #include <stdio.h> #include <stri ...
- 6大排序算法,c#实现
using System; using System.Text; using System.Collections.Generic; namespace ArithmeticPractice { st ...
- 版本管理工具介绍—Git篇
前篇 如题,提起版本管理工具相信做C#开发 还是对Git比较陌生 我们可能更熟悉vss.svn 记录此文的目的 更是为以后的前段学习做基础 现在的技术比如nodeJs angularJs ==都 ...
- [mock]12月27日
一开始介绍项目,最后的反馈是,还是说得不清楚,需要再准备准备. 然后两道题,第一题是有个数组,有2*n个数字,从1~n.比如n=3的数组,{1,2,2,3,1,3}.然后两两相同的数字删除,每次删除得 ...
- jQuery 的 $("someobjectid”).event() 的绑定
经验证,jquery 的 $("someobjectid”).event()事件绑定,如果放在某个会被重新初始化的对象里,就会被多次绑定. 如下 <div id="divID ...
- C#基础精华05(正则表达式,)
正则表达式 . 任意一个字符 除了\n以外的 [] [0-9] [0-9a-zA-Z] | 或 [0-9]|[a-z] () 提升优先级别 分组 ([a]|[0-9])[0 ...
- 最受欢迎的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...