当前位置: 移动技术网 > IT编程>开发语言>Java > java Socket实现简单模拟HTTP服务器

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

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

具体字段这里不作解释,不懂的请先自己了解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 = "/";
          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服务器全过程。希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网