自己手写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 200 OK

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:23:42 GMT

Content-Length:112

好了,我们测试一下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

会返回我们的网页,你可以试试

时间: 2024-10-29 07:33:02

自己手写http服务器 http响应信息的封装与测试的相关文章

手写Tomcat服务器

预备知识 编写服务器用到的知识点 1) Socket 编程2) HTML3) HTTP 协议4) 反射5) XML 解析6) 服务器编写 Socket编程 https://www.cnblogs.com/bfcs/p/10790130.html HTML知识 HTML:HyperText Markup Language 超文本标记语言用于描述网页文档的一种标记语言 表单(form):与用户之间进行交互 method:请求方式 get/post get 数据量小,安全性低,默认方式 post 数据

【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的ml包含了很多的ML框架接口,就试试了. 详细的OpenCV文档:http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html mnist数据下载:http://yann.l

安装MXnet包,实现MNIST手写数体识别

我想写一系列深度学习的简单实战教程,用mxnet做实现平台的实例代码简单讲解深度学习常用的一些技术方向和实战样例.这一系列的主要内容偏向于讲解实际的例子,从样例和代码里中学习解决实际问题.我会默认读者有一定神经网络和深度学习的基础知识,读者在这里不会看到大段推导和理论阐述.基础理论知识十分重要,如果读者对理论知识有兴趣,可以参看已有的深度学习教程补充和巩固理论基础,这里http://deeplearning.net/reading-list/tutorials/有一些不错的理论教程,相关的理论知

第三节,TensorFlow 使用CNN实现手写数字识别

上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,着一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即测试集和验证集 [2]: 引入 tensorflow 启动InteractiveSession(比session更灵活) [3]: 定义两个初始化w和b的函数,方便后续操作 [4]: 定义卷积和池化函数,这里卷积采用padding,使得 输入输出图像一样大,池化采取2x2,那么就是4格变一格 [5]

对服务器端接口的调用,自己手写了一个脚本,但返回信息的中文总是乱码(这个方法很不错,重要的是解决思路,寻找手写脚本与录制脚本 生成目录文件的区别)

对服务器端接口的调用,自己手写了一个脚本,但返回信息的中文总是乱码.在网上搜索了很多方法,包括: 1.Tools->Recording Options->Advanced->勾选Support charset UTF-8 2.Run-time Settings->Browser->Browser Emulation->Change,将language置为中文 3.web_add_auto_header("Accept-Language","

自己动手写web服务器一(浏览器的访问信息)

要协议一个web服务器,需要了解http协议,下面我们来看一下当浏览器请求网张的时候向web服务器发送的数据,我使用的是ubuntu 中telent展现一个下过程. 我需要一个简单的网站来演示一下,我装了一个apache.来完成成这个过程.下面为过程展示. 其实,访问一个网站就是浏览器web服务器指定端口发送信息,然后,web服务器向浏览器发送网页的内容, 1.使用telnet连接网站 2.输入请求的页面. GET  /   HTTP/1.0 或者 GET /index.html  HTTP/1

.net学习之Session、Cookie、手写Ajax代码以及请求流程

1.IIS 7 以上版本集成了两种模式,一种是经典模式,一种是集成模式(直接将asp.net框架集成到IIS中) 2.浏览器和服务器端通过什么技术来实现的?Socket(套接字),通信的语法是HTTP协议,也就是请求报文和响应报文 3.浏览器请求asp.net页面实际是请求的asp.net页面里的ProcessRequest方法 4.请求一般处理程序时,找到ashx页面后台类ashx.cs,创建类对象并调用ProcessRequest方法,生成响应报文体,发回浏览器 5.post表单提交方式:数

一套手写ajax加一般处理程序的增删查改

倾述下感受:8天16次驳回.这个惨不忍睹. 好了不说了,说多了都是泪. 直接上代码 : 这个里面的字段我是用动软生成的,感觉自己手写哪些字段太浪费时间了,说多了都是泪 ajax.model层的代码: using System; namespace Ajax.Model { /// <summary> /// SM_Class:实体类(属性说明自动提取数据库字段的描述信息) /// </summary> [Serializable] public partial class SM_C

(二)springMvc原理和手写springMvc框架

我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器找到具体的处理器(可以根据xml配置.注解进行查找),生成处理器对象及处理器拦截器(如果有则