热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

java使用socket实现一个多线程web服务器的方法

今天小编就为大家分享一篇java使用socket实现一个多线程web服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

除了服务器类,还包括请求类和响应类

请求类:获取客户的HTTP请求,分析客户所需要的文件

响应类:获得用户请求后将用户需要的文件读出,添加上HTTP应答头。发送给客户端。

服务器处理类

package com.lp.app.webserver;

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

//使用Socket创建一个WEB服务器,本程序是多线程系统以提高反应速度。
class WebServer
{
 public static String WEBROOT = "";//默认目录
 public static String defaultPage = "index.htm";//默认文件
 public static void main (String [] args) throws IOException
 {
 System.out.println ("服务器启动...\n"); 
 //使用8080端口提供服务
 ServerSocket server = new ServerSocket (8080);
 while (true)
 {
  //阻塞,直到有客户连接
  Socket sk = server.accept ();
  System.out.println ("Accepting Connection...\n");
  //启动服务线程
  new WebThread (sk).start ();
 }
 }
}


//使用线程,为多个客户端服务
class WebThread extends Thread
{
 private Socket sk;
 WebThread (Socket sk)
 {
  this.sk = sk;
 }

 //线程体
 public void run ()
 {
  InputStream in = null;
  OutputStream out = null;
  try{
  in = sk.getInputStream();
  out = sk.getOutputStream();
  //接收来自客户端的请求。
  Request rq = new Request(in);
  //解析客户请求
  String sURL = rq.parse();
  System.out.println("sURL="+sURL);
  if(sURL.equals("/")) 
   sURL = WebServer.defaultPage;
  Response rp = new Response(out);
  rp.Send(sURL); 
  }
  catch (IOException e)
  {
  System.out.println (e.toString ());
  }
  finally
  {
  System.out.println ("关闭连接...\n");
  //最后释放资源
  try{
   if (in != null)
   in.close ();
   if (out != null)
   out.close ();
   if (sk != null)
   sk.close ();
  }
  catch (IOException e)
  {
  }
  }
 }
}

请求类

package com.lp.app.webserver;

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

//获取客户的HTTP请求,分析客户所需要的文件
public class Request{
 InputStream in = null;

 //获得输入流。这是客户的请求数据。
 public Request(InputStream input){
 this.in = input;
 }

 //解析客户的请求
 public String parse() {
 //从Socket读取一组数据
 StringBuffer requestStr = new StringBuffer(2048);
 int i;
 byte[] buffer = new byte[2048];
 try {
 i = in.read(buffer);
 }
 catch (IOException e) {
 e.printStackTrace();
 i = -1;
 }
 for (int j=0; j index1)
  return requestString.substring(index1 + 1, index2);
 }
 return null;
 }
}

响应类

package com.lp.app.webserver;

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

//获得用户请求后将用户需要的文件读出,添加上HTTP应答头。发送给客户端。
public class Response{
 OutputStream out = null;

 //发送请求的文件
 public void Send(String ref) throws IOException {
 byte[] bytes = new byte[2048];
 FileInputStream fis = null;
 try {
 //构造文件
 File file = new File(WebServer.WEBROOT, ref);
 if (file.exists()) {
  //构造输入文件流
  fis = new FileInputStream(file);
  int ch = fis.read(bytes, 0, 2048);
  //读取文件
  String sBody = new String(bytes,0);
  //构造输出信息
  String sendMessage = "HTTP/1.1 200 OK\r\n" +
  "Content-Type: text/html\r\n" +
  "Content-Length: "+ch+"\r\n" +
  "\r\n" +sBody;
  //输出文件
  out.write(sendMessage.getBytes());
 }else {
  // 找不到文件
  String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
  "Content-Type: text/html\r\n" +
  "Content-Length: 23\r\n" +
  "\r\n" +
  "

File Not Found

"; out.write(errorMessage.getBytes()); } } catch (Exception e) { // 如不能实例化File对象,抛出异常。 System.out.println(e.toString() ); } finally { if (fis != null) fis.close(); } } //获取输出流 public Response(OutputStream output) { this.out = output; } }

以上这篇java使用socket实现一个多线程web服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • Canopy环境安装与使用指南
    《利用Python进行数据分析》一书推荐使用EPDFree版本的环境,然而随着技术的发展,目前更多人倾向于使用Canopy。本文将详细介绍Canopy的安装及使用方法。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • HTML 表格与列表标签详解
    本文详细介绍了HTML中的表格标签和列表标签的使用方法,包括如何创建表格的不同部分(如标题、头部、主体和脚部),以及如何利用这些标签进行数据展示和布局设计。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 本文探讨了当通过Nginx访问网站时出现504 Gateway Timeout错误的解决方案,特别是当请求处理时间超过30秒时的情况。文章提供了调整PHP-FPM配置的具体步骤,以延长请求超时时间。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 本文详细探讨了如何根据不同的应用场景选择合适的PHP版本,包括多版本切换技巧、稳定性分析及针对WordPress等特定平台的版本建议。 ... [详细]
author-avatar
手机用户2502907057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有