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

 更新时间:2018年10月16日 11:01:04   作者:数据架构师  
今天小编就为大家分享一篇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<i; j++) {
 requestStr.append((char) buffer[j]);
 }
 System.out.print(requestStr.toString());
 return getUri(requestStr.toString());
 }

 //获取URI信息字符
 private String getUri(String requestString) {
 int index1, index2;
 index1 = requestString.indexOf(' ');
 if (index1 != -1) {
 index2 = requestString.indexOf(' ', index1 + 1);
 if (index2 > 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" +
  "<h1>File Not Found</h1>";
  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服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何修改maven默认的JDK版本

    如何修改maven默认的JDK版本

    这篇文章主要介绍了如何修改maven默认的JDK版本,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 散列算法与散列码(实例讲解)

    散列算法与散列码(实例讲解)

    下面小编就为大家带来一篇散列算法与散列码(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java Spring Cloud Bus 实现配置实时更新详解

    Java Spring Cloud Bus 实现配置实时更新详解

    这篇文章主要介绍了SpringCloud Bus如何实现配置刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • Springboot指定扫描路径的实现示例

    Springboot指定扫描路径的实现示例

    本文主要介绍了Springboot指定扫描路径的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • SpringBoot使用JUL实现日志记录功能

    SpringBoot使用JUL实现日志记录功能

    在SpringBoot中,我们可以使用多种日志框架进行日志记录,其中,JUL(Java Util Logging)是Java平台自带的日志框架,它提供了简单的 API 和配置,可以轻松地进行日志记录,本文将介绍如何在 SpringBoot中使用JUL进行日志记录,并提供示例代码
    2023-06-06
  • @PathVariable为空时指定默认值的操作

    @PathVariable为空时指定默认值的操作

    这篇文章主要介绍了@PathVariable为空时指定默认值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot预防XSS攻击的实现

    SpringBoot预防XSS攻击的实现

    XSS攻击是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面,本文主要介绍了SpringBoot预防XSS攻击的实现,感兴趣的可以了解一下
    2023-08-08
  • idea打开运行配置java web项目的全过程

    idea打开运行配置java web项目的全过程

    这篇文章主要给大家介绍了关于idea打开运行配置java web项目的相关资料,有些时候我们用IDEA跑之前用eclipse中运行的项目的时候,总是不止所措,要不就是只展示html,要不就是不能部署成功,需要的朋友可以参考下
    2023-08-08
  • SpringBoot项目中引入本地JAR包配置的几种方法

    SpringBoot项目中引入本地JAR包配置的几种方法

    SpringBoot有时需要引入本地JAR包以便重用已有的代码库或者第三方库,本文主要介绍了SpringBoot项目中引入本地JAR包配置的几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • 在springboot文件中如何创建mapper.xml文件

    在springboot文件中如何创建mapper.xml文件

    这篇文章主要介绍了在springboot文件中如何创建mapper.xml文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论