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. 识别子串 (string)——后缀自动机+线段树

    题目 [题目描述] 一般地,对于一个字符串 S,和 S 中第 $ i $ 个字符 x,定义子串 $ T=S(i.j) $ 为一个关于 x 的识别子申,当且仅当: 1.$ i \leq x \leq j ...

  2. JAVA进阶----ThreadPoolExecutor机制(转)

    http://825635381.iteye.com/blog/2184680 ThreadPoolExecutor机制 一.概述 1.ThreadPoolExecutor作为java.util.co ...

  3. P4094 [HEOI2016/TJOI2016]字符串 后缀数组+主席树+二分答案

    $ \color{#0066ff}{ 题目描述 }$ 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须 ...

  4. P1969 积木大赛

    题意:给你一段序列,一次操作:[l,r]内所有数+1 初始序列全为0 现在给你最后序列,问最少操作几次能达到这样的序列 蒟蒻表示秒想到------差分啊 每次差分必有一个+1,一个-1 把差分数组求出 ...

  5. Django---队列

    1.队列介绍 任务队列用作跨线程或机器分配工作的机制. 任务队列的输入是称为任务的工作单元. 专用工作进程不断监视任务队列以执行新工作. Celery通过消息进行通信,通常使用经纪人(brokers) ...

  6. HTTP Status 415 – Unsupported Media Type(使用@RequestBody后postman调接口报错)

    1.问题描述:使用springMVC框架后,添加数据接口中,入参对象没使用@RequestBody注解,造成postman发起post请求, from-data可以调通接口,但是raw调不通接口,然后 ...

  7. Qt 学习之路 2(26):反走样

    Qt 学习之路 2(26):反走样 豆子 2012年11月12日 Qt 学习之路 2 9条评论 我们在光栅图形显示器上绘制非水平.非垂直的直线或多边形边界时,或多或少会呈现锯齿状外观.这是因为直线和多 ...

  8. postgresql 如何设置主键自增

    法一: CREATE TABLE customers ( customerid SERIAL primary key , companyname character varying, contactn ...

  9. python 字符串 操作

    去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...

  10. Codeforces Round #532 (Div. 2)- B(思维)

    Arkady coordinates rounds on some not really famous competitive programming platform. Each round fea ...