为什么80%的码农都做不了架构师?>>>   

编写使用java语言实现的Web服务器,主要通过使用java socket 编程来实现,使用java socket编程不仅可以编写web服务器,还可以编写其他网络应用。

WebServer.java

package webbook.chapter2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {
 /** 默认使用的服务器Socket端口号 */
 public static final int HTTP_PORT = 8080;
 private ServerSocket serverSocket;

public void startServer(int port) {
  try {
   serverSocket = new ServerSocket(port);
   System.out.println("Web Server startup on  " + port);
   while (true) {
    Socket socket = serverSocket.accept();
    // 通过线程的方式来处理客户的请求
    new Processor(socket).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

/**
  * WebServer类的启动方法,可以通过命令行参数指定当前Web服务器所使用的端口号。
  */
 public static void main(String[] argv) throws Exception {
  WebServer server = new WebServer();
  if (argv.length == 1) {
   server.startServer(Integer.parseInt(argv[0]));
  } else {
   server.startServer(WebServer.HTTP_PORT);
  }
 }
}

Processor.java

package webbook.chapter2;

import java.io.*;
import java.net.Socket;

/**
 * 处理一个HTTP用户请求的线程类。
 */
public class Processor extends Thread {
 private PrintStream out;
 private InputStream input;
 /** 默认的服务器存放访问内容的目录D:\eclipse3.4\workspace03 */
 public static final String WEB_ROOT = "d:\\eclipse3.4\\workspace03\\webserver2\\htdocs";

public Processor(Socket socket) {
  try {
   input = socket.getInputStream();
   out = new PrintStream(socket.getOutputStream());
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

public void run() {
  try {
   String fileName = parse(input);
   readFile(fileName);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

/**
  * 解析客户机发过的所有HTTP请求,如果是符合HTTP协议内容的, 就分析出客户机所要访问文件的名字,并且返回文件名。
  */
 public String parse(InputStream input) throws IOException {
  BufferedReader in = new BufferedReader(new InputStreamReader(input));
  String inputContent = in.readLine();
  if (inputContent == null || inputContent.length() == 0) {
   sendError(400, "Client invoke error");
   return null;
  }
  // 分析客户请求的HTTP信息,分析出到底想访问哪个文件,
  // 发过来的HTTP请求应该是三部分。

String request[] = inputContent.split(" ");
  if (request.length != 3) {
   sendError(400, "Client invoke error");
   return null;
  }
  // 第一部分是请求的方法
  String method = request[0];
  // 第二部分是请求的文件名
  String fileName = request[1];
  // 第三部分是HTTP版本号
  String httpVersion = request[2];
  System.out.println("Method: " + method + ", file name: " + fileName + ", HTTP version: " + httpVersion);
  return fileName;
 }

/**
  * 处理调用一个文件的请求
  */
 public void readFile(String fileName) throws IOException {
  File file = new File(Processor.WEB_ROOT + fileName);
  if (!file.exists()) {
   sendError(404, "File Not Found");
   return;
  }
  // 把文件的内容读取到in对象中。
  InputStream in = new FileInputStream(file);
  byte content[] = new byte[(int) file.length()];
  in.read(content);
  out.println("HTTP/1.0 200 sendFile");
  out.println("Content-length: " + content.length);
  out.println();
  out.write(content);
  out.flush();
  out.close();
  in.close();
 }

/**
  * 发送错误的信息
  */
 public void sendError(int errNum, String errMsg) {
  out.println("HTTP/1.0 " + errNum + " " + errMsg);
  out.println("Content-type:text/html");
  out.println();
  out.println("<html>");
  out.println("<meta content='text/html; charset=gb2312' http-equiv='Content-Type'/>");
  out.println("<head><title>Error " + errNum + "--" + errMsg + "</title></head>");
  out.println("<h1>" + errNum + " " + errMsg + "</h1>");
  out.println("</html>");
  out.println();
  out.flush();
  out.close();
  System.out.println(errNum+",,,,"+errMsg);
 }
}

在“e:\workspace\webserver” 目录下建立一个htdocs目录,存放需要被访问的html文件等资源。然后运行WebServer类,启动这个Web服务器程序,就可以通过浏览器访问这个服务器了。http://localhost:8080/welcome.html

其实看书还是很重要的,许多细节都在书中有解释。以上例子就是在翻看两年前发的书上看到的。初学时不一定能看懂,但等过了许久回过头来一看原来如此。。。

转载于:https://my.oschina.net/zhk/blog/72245

简单的java web服务器实例相关推荐

  1. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  2. java web 服务器推送技术--comet4j

    1.背景 首先实现服务器推送技术一直一来是B/S应用开发的一块难题,因为是基于HTTP协议的,HTTP协议为无状态,单向性的协议,即,必须由客户端发起一个请求建立连接,服务器接收请求,把数据返回给客户 ...

  3. Linux Java Web 服务器搭建之tomcat安装

    Linux Java Web 服务器搭建之tomcat安装 一 Tomcat 简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是 ...

  4. Java Web Start实例

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. JWS让用户可以下载服务器端的Java Application到本机运行,并且没有安装.配置等繁琐的 ...

  5. javaweb中服务器响应,Java Web服务器响应与JSON

    我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...

  6. Java web 服务器 搭建_搭建一个java web服务端

    最近也是做了一个简单的java web 项目,由于以前也是没接触过,在这里记录下搭建一个web服务端的过程. 一般我们做一个服务端要么在本地自己的电脑上先安装环境,一般是windows系统,主要安装j ...

  7. android客户端+JAVA WEB服务器实现json数据解析

        首先,项目中使用javaweb作为后台服务器,源码地址:服务器和客户端源码地址. 接下来进入正题.        一.java web服务器                   这里就多说了, ...

  8. Java web 服务器连接MySQL数据库代码

    文章目录 前言 一,建立工程 二,导入jar包 三,编写DataBase类实现连接数据库与操作数据库 四,效果图 参考文章 前言 经过前面的环境部署,今天我们终于可以来连接数据库了.参考我之前的文章. ...

  9. java web服务器tomcat介绍【转载】

    机器矩阵2016-08-10 22:14 java程序员亲切地称他为tom猫,看到这只猫可以说明1 服务器部署成功了 ,2 网络是联通的. 到底这只猫是什么来头呢? tomcat是Apache基金会下 ...

  10. Java的echo_简单的Java echo服务器问题

    我正在尝试编写我的第一个套接字服务器,所以我决定从一个非常简单的事情开始,只是为了计算流程:)我正在编写一个简单的 java echo服务器,但问题是(出于某种原因?! )我没有在客户端获得服务器响应 ...

最新文章

  1. Chroot’ing users with openssh[强文推荐]
  2. KafkaProducer初始化时涉及到哪些核心组件?
  3. C语言-数据数据类型、变量与常量
  4. 成功解决:连接sql server时插入数据库内容为乱码,并且输出也为乱码
  5. Python+Appium+POM实现APP端自动化测试
  6. .xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询
  7. 智还王项目中出现的问题和使用的一些方法
  8. Java jar 如何防止被反编译
  9. ws2812b灯带容易坏_树莓派控制WS2812B灯带 - Python
  10. 使用outlook邮件服务器,使用OUTLOOK配置邮件服务
  11. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
  12. Python爬取哔哩哔哩视频
  13. cors数据类型_CORS账号和南方RTK连接怎样操作使用?步骤说明
  14. 最短路径算法 | Bellman-Ford Algorithm
  15. Promise的基本用法以及作用
  16. 错误:未将对象引用设置到对象的实例
  17. html鼠标悬停图片释义文字消失,鼠标悬停,在图片上显示文字~
  18. 怎么在微软官网找到visual studio历史版本
  19. 2.13 描述性统计(平均数,中位数,中数,数据的离散度(极差,平均绝对偏差,方差标准差))...
  20. La Nina 年和El Nino 年 区分

热门文章

  1. python分类器鸢尾花怎么写_机器学习之路: python k近邻分类器 鸢尾花分类预测
  2. 在PHP中怎么判断字符串中没有,在php中搜索字符串中没有的字符
  3. 全网首发:怎样制作CDKEY(7)-新思路
  4. CheerpJ调用的两种方式
  5. 吹嘘自己,只是想别人从吾这里学点东西
  6. LINUX下载编译libyuv
  7. LINUX安装依赖库冲突的最终版本:下列软件包有未满足的依赖关系/但是它将不会被安装/无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  8. 编译OpenJDK8 b232版本
  9. LINUX安装百度网盘
  10. 如果我是决策者,我会决策做CPU吗?