---- Socket入门
近日,读到一本好书---《How Tomcat Works》,该书详尽分析了tomcat的实现原理,解释了它的servlet容器的内部运行机制,读来非常有收获,特此撰文将读书过程中的一些心得付诸文字。
HTTP协议基础知识:
HTTP协议属于应用层协议,基于TCP,一个HTTP请求包括三个组成部分:方法—统一资源标识符(URI)—协议/版本、请求的头部、主体内容
HTTP请求示例:
POST /examples/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
lastName=Franks&firstName=Michael
类似于HTTP请求,一个HTTP响应也包括三个组成部分:方法—统一资源标识符(URI)—协议/版本、响应的头部、主体内容
HTTP响应示例:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2009 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2009 13:13:12 GMT
Content-Length: 112
<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome !!
</body>
</html>
基于Socket的客户端-服务器:
客户端代码:
public static void main(String[] args) throws InterruptedException {
try {
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket socket = new Socket("127.0.0.1", 8080);
//模拟发送HTTP请求
OutputStream os = socket.getOutputStream();
StringBuilder request = new StringBuilder();
request.append("GET /index.jsp HTTP/1.1\n");
request.append("Host: localhost:8080\n");
request.append("Connection: Close\n");
request.append("\n");
os.write(request.toString().getBytes());
os.flush();
//os.close();//关闭 OutputStream 将关闭关联套接字
//读取服务端响应
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
boolean loop = true;
StringBuffer sb = new StringBuffer(8096);
while (loop) {
if (in.ready()) {
int i = 0;
while (i != -1) {
i = in.read();
sb.append((char) i);
}
loop = false;
}
}
System.out.println(sb.toString());
socket.close();
}
catch (UnknownHostException e) {
// log error info
}
catch (IOException e) {
// log error info
}
}
服务器端代码:
public static void main(String[] args) {
boolean shutdown = false;
ServerSocket serverSocket = null;
int port = 8080;
try {
//ServerSocket构造方法的参数说明:port - 本地 TCP 端口,backlog - 队列的最大长度,bindAddr - 要将服务器绑定到的 InetAddress
serverSocket = new ServerSocket(port, 2, InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) {
// log error info
System.exit(1);
}
// 等待请求
while (!shutdown) {
try {
//侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
Socket socket = serverSocket.accept();
//返回此套接字的输出流,用于向客户端写入返回结果
OutputStream output = socket.getOutputStream();
//获取输入流,即客户端发起的HTTP请求
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb = new StringBuffer(8096);
boolean loop = true;
while (loop) {
if (in.ready()) {
int i = 0;
while (i != -1) {
i = in.read();
sb.append((char) i);
}
loop = false;
}
}
// display the request to the out console
System.out.println(sb.toString());
output.write("Response: HTTP/1.1 200 OK ".getBytes());
}
catch (Exception e) {
// log error info
continue;
}
}
}
分享到:
相关推荐
基于QT和Html打造客户端容器的PPT,淘宝的。
cppweb同时也是一个跨平台的微服务开发框架,通过两个核心组件webrouter与webserver提供微服务系统中的接口路由网关、服务注册中心、业务服务容器、定时任务调度中心以及接口...,我们的目标不是实现一个最好cgi容器...
我们将逐步为不同行业用户量身打造行业模板,让您以最快捷的方式,最低的成本创建功能强大的企业网站。PHPWEB是您高效便捷的网站管理工具。PHPWEB可免费用于非商业用途,无需购买授权,直接安装使用。商业用户可以...
JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring(Ioc容器、装配Java Bean...
JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring(Ioc容器、装配Java Bean...
js+canvas打造常见的微信大转盘,本文件仅仅是前端代码,但是接口已经在代码中声明,适用于任何后端。暂时没有后端的话可以挂载到你的Apache或者iis等web容器,并且将.json文件添加到可访问列表。
js+canvas打造常见的微信大转盘,本文件仅仅是前端代码,但是接口已经在代码中声明,适用于任何后端。暂时没有后端的话可以挂载到你的Apache或者iis等web容器,并且将.json文件添加到可访问列表。
Zero Ecotope Framework 是一个基于 Vert.x 的中间件容器,它可以帮助软件开发人员在 Vert.x 中快速开发和实施,集中精力处理项目需求中的业务逻辑而忽略开发过程中的部分细节,项目起源于早期在 Vert.x 生态中缺少...
因此我自己根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了100多个开源项目(项目不限于在github开源的项目), 分成以下十几个大类。 这个项目可以理解为互联网IT人打造的...
这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。 2、使用Spring框架能带来哪些好处? 下面列举了一些使用Spring框架带来的主要好处: ...
这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。 更多信息:Spring 框架教程。 2、使用Spring框架能带来哪些好处? 下面列举了一些使用Spring框架带来的...
打造安全的容器云平台.pdf 敏捷开发中的安全实践.pdf 永无休止的业务逻辑“漏洞”.pdf 移动APP漏洞引发的思考.pdf 精简_SDL_在企业中的落地.pdf 线上应用业务安全.pdf 让我们做Web安全测试吧!.pdf 软件安全...
本书由旧金山HTML5用户组创建人联合另两位资深Web开发专家共同打造,为读者清晰解读了HTML5规范的缘由、发展和现状,全面展示了如何使用 WebSocket、Geolocation、Web Storage、Canvas及音频视频等前所未有的新...
mall项目致力于打造一个完整的电商系统,采用现阶段流行技术实现。 项目文档 文档地址: : 备用地址: ://macrozheng.github.io/mall-learning 项目介绍 mall项目是一套电商系统,包括前台商城系统及后台管理系统,...
罗伟-蘑菇街基于容器的全生命周期 DevOps 运营平台建设 牛晓玲&景韵-转型的灯塔!DevOps 标准认证评估权威指南及案例解读 拍拍贷基础架构的DevOps演进之路-杨波-web 企业如何迈出 DevOps 第一步?-刘相 任发科:...
本书由旧金山HTML5用户组创建人联合另两位资深Web开发专家共同打造,为读者清晰解读了HTML5规范的缘由、发展和现状,全面展示了如何使用 WebSocket、Geolocation、Web Storage、Canvas及音频视频等前所未有的新...
初步打造在线最佳的Java学习笔记,笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解Java基础语法,想进一步深入学习的人 含博客讲解和二进制实例,采用maven构建,分模块学习,涉及反射,代理,多线程...
本书由旧金山HTML5用户组创建人联合另两位资深Web开发专家共同打造,为读者清晰解读了HTML5规范的缘由、发展和现状,全面展示了如何使用 WebSocket、Geolocation、Web Storage、Canvas及音频视频等前所未有的新...
本书由旧金山HTML5用户组创建人联合另两位资深Web开发专家共同打造,为读者清晰解读了HTML5规范的缘由、发展和现状,全面展示了如何使用 WebSocket、Geolocation、Web Storage、Canvas及音频视频等前所未有的新...
本书由旧金山HTML5用户组创建人联合另两位资深Web开发专家共同打造,为读者清晰解读了HTML5规范的缘由、发展和现状,全面展示了如何使用 WebSocket、Geolocation、Web Storage、Canvas及音频视频等前所未有的新...