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. GIT版本控制系统(二)

    貌似第二条有点用,还木有都验证过,贴过来再说~ 转自: http://www.cnblogs.com/lhb25/p/10-useful-advanced-git-commands.html 1. 导 ...

  2. Knights0.

    Knights t数轴上有n个骑士位于1,2,3,...n,移动速度相同,初始移动方向已知,当两个骑士相遇时,各有50%的概率赢,输了就死了,并且移动到0和n+1的位置时移动方向会翻转,问最右的骑士存 ...

  3. Python 文件和异常

    一.从文件中读取数据 #!/usr/bin/env python with open('pi') as file_object: contents = file_object.read() print ...

  4. 树形DP【洛谷P3047】 [USACO12FEB]附近的牛Nearby Cows

    P3047 [USACO12FEB]附近的牛Nearby Cows 农民约翰已经注意到他的奶牛经常在附近的田野之间移动.考虑到这一点,他想在每一块土地上种上足够的草,不仅是为了最初在这片土地上的奶牛, ...

  5. C++基础学习2:命名空间

    C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace. 科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地 ...

  6. jq 使用手册

    翻译整理:Young.J官方网站:http://jquery.com jQuery是一款同prototype一样优秀js开发库类,特别是对css和XPath的支持,使我们写js变得更加方便!如果你不是 ...

  7. pacman命令用法

    Pacman 是一个命令行工具,这意味着当你执行下面的命令时,必须在终端或控制台中进行. 1.更新系统 在 Arch Linux 中,使用一条命令即可对整个系统进行更新: pacman -Syu 如果 ...

  8. 开源linux远程登录、远程文件管理(ftp)工具

    ssh远程登录用 PuTTY.Xshell 5 如果觉得命令行下敲命令管理文件麻烦,就用WinSCP.FileZilla Client(SSH模式),可做到文件上传.下载.改权限等等,很便捷

  9. spring boot 很好的文章

    http://blog.csdn.net/isea533/article/details/50278205

  10. java坏境内存不够用 大量占用swap 临时加swap

    dd if=/dev/sda of=/tmp/mbr.bin   bs=512   count=1 查询2进制文件 file  看文件类型 思路 创建一个大文件作为swap 1.1创建文件 [root ...