java webServer(一)
java webServer实现
浏览器和服务器使用的是http协议,http协议使用的是tcp
这里主要在服务器端监听端口号
实现功能
通过浏览器向服务器发送http请求:http://localhost:9999/index.html(这里监听的是9999端口)
服务器解析http请求,生成Html响应客户端请求
WebServer.java
package com.gxf.webServer; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* web服务器
* 监听9999端口号
* @author Administrator
*
*/
public class WebServer {
//服务器监听端口号
private final int PORT_LISTENING = 9999; public static void main(String args[]){
WebServer webServer = new WebServer(); //启动服务器
webServer.startService();
} //启动web服务器
public void startService(){
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(PORT_LISTENING);
} catch (IOException e) {
e.printStackTrace();
}
while(serverSocket != null){
try {
Socket clientSocket = serverSocket.accept();
//new 一个线程处理客户端请求
new HandleRequest(clientSocket).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 解析客户端的http请求
* 生成html响应客户端请求
* @author Administrator
*
*/
class HandleRequest extends Thread{
//客户端socket
private Socket clientSocket;
private OutputStream os;
private InputStream is; public HandleRequest(Socket clientSocket){
this.clientSocket = clientSocket;
try {
os = this.clientSocket.getOutputStream();
is = this.clientSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
} public void run(){
//解析客户端http请求
BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
String requestLine = "";
String resourceRequest = "";
try {
requestLine = bfr.readLine();
int spaceStartIndex = requestLine.indexOf(" ");
int spaceEndIndex = requestLine.indexOf("HTTP");
resourceRequest = requestLine.substring(spaceStartIndex, spaceEndIndex);
} catch (IOException e) { e.printStackTrace();
} //生成html输出到客户端浏览器,响应客户端请求
PrintStream ps = new PrintStream(os);
ps.println("<html>");
ps.println("<meta content='text/html; charset=gb2312' http-equiv='Content-Type'/>");
ps.println("<head><title>Welcome To MyWebServer</title></head>");
ps.println("<h1>request resource is:" + resourceRequest + "</h1>");
ps.println("</html>"); ps.flush();
ps.close(); try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里只是解析了请求的资源
来一请求,开一个线程处理,如果大量request,或者处理request时间长了,服务器会崩溃
Excutor版本
ExcutorWebServer.java
package com.gxf.webServer; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; /**
* web服务器
* 使用Excutor框架
* @author Administrator
*
*/
public class ExcutorWebServer {
//监听端口号
private static final int PORTNUM_LISTENING = 9999;
//线程池大小
private static final int NUM_THREADS_POOL = 100; private static Executor executor = Executors.newFixedThreadPool(NUM_THREADS_POOL); public static void main(String args[]) throws IOException{
ServerSocket serverSocket = new ServerSocket(PORTNUM_LISTENING);
while(true){
final Socket clientSocket = serverSocket.accept(); Runnable task = new Runnable(){
public void run(){
//处理客户端请求
try {
handlRequest(clientSocket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}; executor.execute(task);
}
} /**
* 处理请求
* @param task
* @throws IOException
*/
public static void handlRequest(Socket clientSocket) throws IOException{
System.out.println(clientSocket.getRemoteSocketAddress());
//解析客户端http请求
BufferedReader bfr = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String requestLine = "";
String resourceRequest = "";
try {
requestLine = bfr.readLine();
int spaceStartIndex = requestLine.indexOf(" ");
int spaceEndIndex = requestLine.indexOf("HTTP");
resourceRequest = requestLine.substring(spaceStartIndex, spaceEndIndex);
} catch (IOException e) { e.printStackTrace();
} //生成html输出到客户端浏览器,响应客户端请求
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println("<html>");
ps.println("<meta content='text/html; charset=gb2312' http-equiv='Content-Type'/>");
ps.println("<head><title>Welcome To MyWebServer</title></head>");
ps.println("<h1>request resource is:" + resourceRequest + "</h1>");
ps.println("</html>"); ps.flush();
ps.close(); try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java webServer(一)的更多相关文章
- Java开发环境的基本设置
作为Java的刚開始学习的人,不知道其它的刚開始学习的人有没有和我一样的感受:用Java开发须要配置这么复杂 的环境.太难了.第一次配置时,一团混乱.Oracle监听服务打不开了,PLSql连接不上O ...
- 深入理解Java和MySQL乱码问题
近期我们使用tomcat和MySQL搭建了一个Java Webserver,并将游戏的server逻辑部署在该server上. 游戏上线后不久,我们发现数据库中出现了大量的乱码.这是个很严重的问题,因 ...
- Web 请求响应原理(转)
用Java实现Web服务器 减小字体 增大字体 摘要:WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,H ...
- CometD的消息推送
CometD 框架 CometD 框架是基于 HTTP 的事件驱动通信解决方案.CometD 框架提供了一个 Java 服务器部件和一个 Java 客户端部件,还有一个基于 jQuery 和 Dojo ...
- .NET 5.0 RC1 发布,离正式版发布仅剩两个版本
原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver
转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章非常少有人看啊~哈~ 今天准备具体介绍jav ...
- java实现简单webserver(分析+源码)
在日常的开发中,我们用过非常多开源的webserver,比如tomcat.apache等等.如今我们自己实现一个简单的webserver,主要的功能就是用户点击要訪问的资源,server将资源发送到c ...
- Java类WebServer及中间件拿webshell方法总结
0.序 原文名称:Tomcat.Weblogic.JBoss.GlassFish.Resin.Websphere弱口令及拿webshell方法总结 原文from:http://www.hack80.c ...
随机推荐
- [poj 2456] Aggressive cows 二分
Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...
- __weak 和 __strong 还有Autorelease的用法
使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool: Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop ...
- [转]Groovy Goodness
http://mrhaki.blogspot.com/2014/12/gradle-goodness-continue-build-even.html 介绍了不少使用Groovy编写脚本的好例子,可以 ...
- C语言初步学习I/O函数scanf、getchar、printf和putchar
scanf().printf().getchar()和putchar()这四个函数能够让用户和程序交流,所以被称为输入/输出函数,或简称为I/O函数. 这里先结合缓冲输入来讲讲scanf()和getc ...
- Gym - 101572E Emptying the Baltic bfs加剪枝
题目传送门 题目大意:给出一幅海洋的描述,0为海平面,负数即有水,在给出的xy坐标的底部安放抽水机,问最多能有多少水.水往低处流,且八个方向都可以. 思路:bfs,记录到每一个节点有效的最低海平面,然 ...
- 批处理中setlocal enabledelayedexpansion的含义
setlocal enabledelayedexpansion 延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展! CMD在解 ...
- IDEA中如何添加jar包
File -> Project Structure -> Libraries -> + -> jar -> 选择classes
- git命令行操作:拉不到最新代码???
现场场景: 仓库中有一个包名使用了驼峰命名,还有一个非驼峰的同名包, windows系统下因为不区分文件夹大小写,拉取没问题,但是本地push不上去.打算到Linux上clone下来后,删除那个驼 ...
- /etc目录下重要的目录和文件
牢记: 1.*/etc/sysconfig/network-scripts/ifcfg-eth0 网卡的配置信息 重启网卡:1)/etc/init.d/network restart(所有网卡) ...
- 转 [Error]EOL while scanning string literal
https://blog.csdn.net/orangleliu/article/details/38943749 项目中有个定时任务,每天取到一些表数据传到一个外部接口,但是最近总是有异常,今天查了 ...