package com.day5;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date; public class Tomcat { /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception { //申请注册8080套接字
ServerSocket server=new ServerSocket(8080); System.out.println("开始接受请求...");
//接受客户端请求
Socket socket = server.accept(); Response response=new Response(socket); //设置网页DOM数据
response.write("<title>Thinking in Java</title>");
response.write("<h1>liu shi hua</h1>");
response.write("<h2 style='color:red;'>771541213@qq.com</h2>"); response.pushToClient(); socket.close();
server.close(); } }
package com.day5;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date; /**
* 简单封装Response对象
* @author 刘诗华 liu shi hua...
*
*/
public class Response { //换行符
private final String CRLF = "\r\n";
//客户端socket对象
private Socket socket;
//缓冲字符流输出对象
private BufferedWriter bw=null;
//正文内容长度
private int len;
//响应头
private StringBuilder headerStr;
//正文内容
private StringBuilder content; public Response()
{
len=0;
this.headerStr=new StringBuilder();
this.content=new StringBuilder();
} public Response(Socket socket) throws Exception
{
this();
this.socket=socket;
//字符输出流对象
OutputStream out = this.socket.getOutputStream();
//将字节输出流转换成字符输出流
OutputStreamWriter writer = new OutputStreamWriter(out); this.bw=new BufferedWriter(writer);
} //构造响应报文
public void setHeader()
{
this.headerStr.append("HTTP/1.1 200 OK").append(CRLF);
this.headerStr.append("Server:Apache/2.4.10 (Win32) PHP/5.3.28").append(CRLF);
this.headerStr.append("Date:").append(new Date()).append(CRLF);
this.headerStr.append("Content-Type:text/html").append(CRLF);
this.headerStr.append("Content-Length: ").append(len).append(CRLF);
this.headerStr.append(CRLF);
} //设置正文内容信息
public Response write(String str)
{
//计算正文内容长度
len+=(str+CRLF).getBytes().length;
this.content.append(str).append(CRLF);
return this;
} //发送数据到客户端
public void pushToClient() throws Exception
{
//第一步,构造响应头
setHeader();
//第二步,追加正文内容
this.bw.append(this.headerStr.toString());
this.bw.append(this.content.toString()); this.bw.flush();
//关闭资源
this.bw.close();
this.socket.close();
}
}

执行结果:

03-封装Response响应的更多相关文章

  1. NIO开发Http服务器(4):Response封装和响应

    最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...

  2. java21 封装Response:

    封装Response: /** * 封装响应信息 */ public class Response { //两个常量 public static final String CRLF="\r\ ...

  3. Response响应对象

    1.HttpServletResponse HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息.HTTP ...

  4. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  5. 二次封装Response类 | 视图类传递参数给序列化类context

    二次封装Response类 源码: class Response(SimpleTemplateResponse): """ An HttpResponse that al ...

  6. drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族

    目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...

  7. 5) ModelSerializer(重点) 基表 测试脚本 多表关系建外键 正反查 级联 插拔式连表 序列化反序列化整合 增删查 封装response

    一.前戏要做好 配置:settings.py #注册drf INSTALLED_APPS = [ # ... 'api.apps.ApiConfig', 'rest_framework', ] ​ # ...

  8. Django(53)二次封装Response

    前言 有时候我们使用drf的Response,会发现默认返回的格式不太友好,每次我们都需要写入以下的格式 return Response({ "status": 0, " ...

  9. Servlet的学习之Response响应对象(3)

    本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...

随机推荐

  1. Python之时间(time)模块

    在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time( ...

  2. 诡异的bug!!

    在我些项目的时候,命名从来没有用过 font 元素,但是打开 Chrome 浏览器查看元素时,总是 font 元素???而且写的 <span class= "xxx"> ...

  3. Java WEB ----- 文件的上传

    最近学到的web阶段的文件的上传,就想记录一下,帮助自己复习以及帮助大家学习,一般我都会把上传的文件存到服务器中的web-inf 下面,因为这样用户不会直接访问到,我们存到数据库的一般都是路径.这里没 ...

  4. VirtualBox fedora29 安装

    目录 准备工作 VirtualBox安装 fedora安装 快捷键定义 准备工作 平台配置 win10 64位 内存 8G 硬盘 1T 下载地址 VirtualBox 5.2.22:https://w ...

  5. C语言与C++语言的强制类型转换格式区别

    C语言:(类型)(表达式),其中类型的括号()必须带. C++语言:(类型)(表达式),其中类型的括号()跟进表达式选带.

  6. UVALive - 4223,hdu2962(简单dijkstra)

    Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. Object.create(null)、Object.create({})、{} 三者创建对象的区别

    参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProp ...

  8. nginx配置socket服务

    1.服务器环境:centos7.5 2.安装nginx 首先下载:wget http://nginx.org/download/nginx-1.14.0.tar.gz 解压:tar zxvf  ngi ...

  9. zabbix3.4安转

    其实很简单  在官网上有安装文档,我只不过是将官网上的拿了下来 安装apache和php 数据库mariadb(我的系统是centos7的所以安装mariadb) 开始zabbix的安装 本次实验 系 ...

  10. php之异常处理

    <?php declare(strict_types = 1); function demo(int $v):int{ return 1; } try{ demo("1"); ...