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. H - the Sum of Cube(水题)

    A range is given, the begin and the end are both integers. You should sum the cube of all the intege ...

  2. Java异常处理方式

    前言 平时在开发的时候避免不了的出一些大大小小的不同类型的错误,这时候,对于这些异常怎么处理呢,显得至关重要了. 内容 分类 Trowable:有两个重要的子类,Exception(异常)和Error ...

  3. manjaro linux KDE桌面网易云音乐点击托盘图标无反应

    这是一个很奇怪的问题,它的解决方法更奇怪... 找到网易云,右键,选择“编辑应用程序” 在打开的窗口中选中应用程序一栏 将“命令”的内容替换为: 1 env XDG_CURRENT_DESKTOP=D ...

  4. IO流图

    1.InputStream类是字节输入流的抽象类,是所有字节输入流的父类,InputStream类具有层次结构如下图所示: 2.Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类. ...

  5. light oj 1047 - Neighbor House(贪心)

    The people of Mohammadpur have decided to paint each of their houses red, green, or blue. They've al ...

  6. DJ

    必知必会13条 all():查询所有结果 filter(**kwargs)   过滤,取到符合条件的对象,比get方法好,找不到会返回空 get(**kwargs)      取到符合条件对象,对象有 ...

  7. Go语言基础之4--流程控制

    一.if else语句 1.1 基本语法1 语法1: if condition { //do something } 语法2: if condition { //do something } else ...

  8. my25_Mysql操作技巧汇总

    1. drop database 在数据量很大的情况下,最好先对表进行truncate,然后再drop database:不然会卡住很长的时间. 2. 数据的逻辑导入导出 如果数据量大,又需要进行逻辑 ...

  9. 使用Koa.js,离不开这十个中间件

    随着ES6的普及,async/await的语法受到更多JS开发者的青睐,Koa.js作为比较早支持使用该语法的Node框架越来越受到大家的喜爱,虽然Koa.js本身支持的功能很有限,但官方和社区提供了 ...

  10. JVM---概述

    1.JVM架构 1.1 JVM组成: ClassLoader类加载器 : 将class文件加载到JVM内存中: Runtime Data Area运行时数据区域 :  java程序运行时的内存区域: ...