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(一)的更多相关文章

  1. Java开发环境的基本设置

    作为Java的刚開始学习的人,不知道其它的刚開始学习的人有没有和我一样的感受:用Java开发须要配置这么复杂 的环境.太难了.第一次配置时,一团混乱.Oracle监听服务打不开了,PLSql连接不上O ...

  2. 深入理解Java和MySQL乱码问题

    近期我们使用tomcat和MySQL搭建了一个Java Webserver,并将游戏的server逻辑部署在该server上. 游戏上线后不久,我们发现数据库中出现了大量的乱码.这是个很严重的问题,因 ...

  3. Web 请求响应原理(转)

    用Java实现Web服务器 减小字体 增大字体 摘要:WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,H ...

  4. CometD的消息推送

    CometD 框架 CometD 框架是基于 HTTP 的事件驱动通信解决方案.CometD 框架提供了一个 Java 服务器部件和一个 Java 客户端部件,还有一个基于 jQuery 和 Dojo ...

  5. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本

    原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...

  6. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  7. Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章非常少有人看啊~哈~ 今天准备具体介绍jav ...

  8. java实现简单webserver(分析+源码)

    在日常的开发中,我们用过非常多开源的webserver,比如tomcat.apache等等.如今我们自己实现一个简单的webserver,主要的功能就是用户点击要訪问的资源,server将资源发送到c ...

  9. Java类WebServer及中间件拿webshell方法总结

    0.序 原文名称:Tomcat.Weblogic.JBoss.GlassFish.Resin.Websphere弱口令及拿webshell方法总结 原文from:http://www.hack80.c ...

随机推荐

  1. JS字符串替换(jQuery)

    ①自己封装的一个方法String.format String.format = function() { var s = arguments[0]; for (var i = 0; i < ar ...

  2. SQL基础(一)

    经过这段时间对SQL的基础学习,下面对自己的学习做个总结或者也可以说是个回顾吧! 我练习的是在oracle数据库平台上,并且安装了PLSQL Developer工具.下面是我从小白开始一路学习的回顾: ...

  3. php 顺序线性表

    <?php /* * 线性顺序表 ,其是按照顺序在内存进行存储,出起始和结尾以外都是一一连接的(一般都是用一维数组的形式表现) * * GetElem: 返回线性表中第$index个数据元素 * ...

  4. (转)TestNG框架提供两种传入参数的方法:

    1.从testng.xml传入参数. 如果参数是一些简单的值,可以直接在testng.xml中定义.这也是最常用的一种. 可以在测试用例中给参数一个默认值.这样,即使在xml文件中没有这个变量,你的测 ...

  5. Git的安装使用

    1.什么是Git Git是一个自由和开源的分布式版本管理工具,用于有效.高速的处理任何或大或小的项目.最初由Linux Torvalds编写,用于帮助管理Linux内核开发而开发的一个开放源码的版本管 ...

  6. html 一些坑。。。

    margin-left 和 margin-right 才能够使用 auto top 和 bottom 不可以 在网页设计中...通常给img 父容器 一个 宽度...同时 ,指定 img width= ...

  7. P4173 残缺的字符串(FFT)

    [Luogu4173] 题解 \(1.\)定义匹配函数 \(2.\)定义完全匹配函数 \(3.\)快速计算每一位的完全匹配函数值 #include<cstdio> #include< ...

  8. 用异或运算交换两个整数实现swap函数功能

    对于异或运算有这如下说明: 1^1=0 0^0=0 1^0=1 0^1=1 简单理解就是当两个书相同时结果为0,而两个数不同时异或的结果为1 可用于两个整数的交换,而不用去引入一个中间变量 #incl ...

  9. hdu6441 Find Integer 求勾股数 费马大定理

    题目传送门 题目大意: 给出a和n,求满足的b和c. 思路: 数论题目,没什么好说的. 根据费马大定理,当n>2时不存在正整数解. 当n=0或者1时特判一下就可以了,也就是此时变成了一个求勾股数 ...

  10. 75th LeetCode Weekly Contest Rotate String

    We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...