欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java Socket实现简单模拟HTTP服务器

程序员文章站 2024-02-22 09:31:58
最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用java socket api 模拟做一个http服务器,巩固一下应用层的知识。 ht...

最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用java socket api 模拟做一个http服务器,巩固一下应用层的知识。

http基于tcp协议,协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、url、协议版本、以及包含请求修饰符、客户信息和内容的类似于mime的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容——百度百科。
话不多说,还是直接上图。

java Socket实现简单模拟HTTP服务器

具体字段这里不作解释,不懂的请先自己了解http协议。这里主要是根据请求响应这一过程模拟http服务器。

下面是代码:

package com.example.httpserver;

import java.io.file;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.net.serversocket;
import java.net.socket;

public class httpserver {
  private static final integer port = 80;//http默认端口80

  public static void main(string[] args) {
    serversocket serversocket;

    try {
      //建立服务器socket,监听客户端请求
      serversocket = new serversocket(port);
      system.out.println("server is running on port:"+serversocket.getlocalport());
      //死循环不间断监听客户端请求
      while(true){
        final socket socket = serversocket.accept();
        system.out.println("biuld a new tcp link with client,the cient address:"+ 
            socket.getinetaddress()+":"+socket.getport());
        //并发处理http客户端请求
        service(socket);
      }
    } catch (ioexception e) {
      e.printstacktrace();
    }
  }

  public static void service(socket socket)
  {
    new thread(){
      public void run(){
        inputstream insocket;
        try {
          //获取http请求头
          insocket = socket.getinputstream();
          int size = insocket.available();
          byte[] buffer = new byte[size];
          insocket.read(buffer);
          string request = new string(buffer);
          system.out.println("clientbrowser:\n"+request+"\n"
              + "------------------------------------------------------------------");

          string firstlineofrequest = "";
          string[] heads;
          string uri = "/index.html";
          string contenttype ="";
          if(request.length() > 0){
            firstlineofrequest = request.substring(0,request.indexof("\r\n"));
            heads = firstlineofrequest.split(" ");
            uri = heads[1];

            if(uri.indexof("html") != -1){
              contenttype = "text/html";
            }else{
              contenttype = "application/octet-stream";
            }
          }
          //将响应头发送给客户端
          string responsefirstline = "http/1.1 200 ok\r\n";

          string responsehead = "content-type:" + contenttype +"\r\n";

          outputstream outsocket = socket.getoutputstream();
          system.out.println("serverresponse:\n"+responsefirstline+"\n"+responsehead+"\n"
              + "--------------------------------------------------------------------");
          outsocket.write(responsefirstline.getbytes());
          outsocket.write(responsehead.getbytes());
          //通过http请求中的uri读取相应文件发送给客户端
          fileinputstream writehtml = new fileinputstream(new file("wwwroot"+uri));
          outsocket.write("\r\n".getbytes()); 
          byte[] htmlbuffer = new byte[writehtml.available()];
          if(writehtml !=null){
            int len = 0;
            system.out.println("writehtml");
            while((len = writehtml.read(htmlbuffer)) != -1){
              outsocket.write(htmlbuffer, 0,len);
            }
          }
          outsocket.close();
          socket.close();

        } catch (ioexception e) {
          e.printstacktrace();
        }
      }
    }.start();
  }

}

代码看注释也很容易理解。现在我们在浏览器中输入服务器地址+要访问的文件

java Socket实现简单模拟HTTP服务器

在看我们控制台输出的内容:

java Socket实现简单模拟HTTP服务器

以上就是java socket 简单的模拟http服务器全过程。希望对大家的学习有所帮助,也希望大家多多支持。