模拟界面请求到web服务器

客户端

package com.lsw.client;

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

public class HTTPClinet {
    public static void main(String[] args){
        //确定http请求的uri
        String uri = "index.html";
        if(args.length !=0)
            uri = args[0];

        //按照get请求方式访问httpserver
        doGet("localhost",8080,uri);
    }
    //按照get请求方式访问httpserver
    public static void doGet(String host,int port,String uri){
        Socket socket = null;

        try{
            //与httpserver建立ftp连接
            socket = new Socket(host,port);
        }
        catch(Exception e){
            e.printStackTrace();
        }

        try{
            //创建http请求
            //http请求的第一行
            StringBuffer sb = new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
            //http请求头
            sb.append("Accept: */*\r\n");
            sb.append("Accept-Language: zh-cn\r\n");
            sb.append("Accept-Encoding: gzip, deflate\r\n");
            sb.append("User-Agent: HTTPClient\r\n");
            sb.append("Host: localhost:8080\r\n");
            sb.append("Connection: Keep-Alive\r\n\r\n");

            //发送http请求
            OutputStream socketOut = socket.getOutputStream(); //获得输出流
            socketOut.write(sb.toString().getBytes());

            //睡眠2秒,等待响应结果
            Thread.sleep(2000);

            //接收响应结果
            InputStream socketIn = socket.getInputStream(); //获得输入流
            int size = socketIn.available();
            byte[] buffer = new byte[size];
            socketIn.read(buffer);
            String request = new String(buffer);
            System.out.println(request);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally{
            try{
                socket.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

}

服务端

package com.lsw.server;

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

public class HTTPServer {
    public static void main(String[] args){
        int port;
        ServerSocket serverSocket;

        try{
            port = Integer.parseInt(args[0]);
            System.out.println("默认端口是: " + port);
        }
        catch(Exception e){
            System.out.println("默认端口8080");
            port = 8080;
        }

        try{
            //创建监听端口
            serverSocket = new ServerSocket(port);
            System.out.println("服务器正在监听端口: " + serverSocket.getLocalPort());
            while(true){
                try{
                    //等待客户的链接请求
                    final Socket socket = serverSocket.accept();
                    System.out.println("建立了一个与客户的新的TCP连接,该客户的地址为: " + socket.getInetAddress()
                            + " 端口为 : " + socket.getPort());
                    //响应客户请求
                    service(socket);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
            }   

        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void service(Socket socket) throws Exception{
        //读取HTTP请求信息
        InputStream socketIn = socket.getInputStream(); //获得输入流
        //睡眠500毫秒,等待http请求
        Thread.sleep(500);
        int size = socketIn.available();
        byte[] buffer = new byte[size];
        socketIn.read(buffer);
        String request = new String(buffer);
        //打印http请求数据
        System.out.println("客户端请求的数据为: " +request);

        //解析http请求
        //获得http请求第一行
        String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
        System.out.println("firstLineOfRequest= " +firstLineOfRequest);
        //解析http请求的第一行
        String[] parts = firstLineOfRequest.split(" ");
        //解析http请求这种的uri
        String uri = parts[1];
        System.out.println("解析http请求这种的uri=" + uri);
        System.out.println("截图的值为=" + uri.substring(0, 1).toString());
        String flag = uri.substring(0, 1).toString();
        if(flag.equals("/")){
            System.out.println("此请求是从浏览器发起的请求");
            uri = uri.substring(1).toString();
        }

        System.out.println("解析http请求这种的uri=" + uri);

        //决定http响应正文的类型,此处作了简化处理
        String contentType;
        if(uri.indexOf("html") != -1 || uri.indexOf("htm") != -1)
            contentType ="text/html";
        else if(uri.indexOf("jpg") != -1 || uri.indexOf("jpeg") != -1)
            contentType ="image/jpeg";
        else if(uri.indexOf("gif") != -1)
            contentType ="image/gif";
        else
            contentType = "application/octet-stream"; //字节流类型

        //创建http响应结果
        //创建http响应的第一行
        String responseFirstLine = "HTTP/1.1 200 OK\r\n";
        //http响应头
        String responseHeader = "Content-Type:" +contentType + "\r\n\r\n";
        //获得读取响应正文数据的输入流
        /*InputStream in = HTTPServer.class.getResourceAsStream(uri); 书上这么写的  哎*/
        InputStream in = HTTPServer.class.getClassLoader().getResourceAsStream(uri);

        //发送http响应结果
        OutputStream socketOut = socket.getOutputStream(); //获得输出流
        //发送http响应的第一行
        socketOut.write(responseFirstLine.getBytes());
        //发送http响应的头
        socketOut.write(responseHeader.getBytes());
        System.out.println("报文头发送完成");
        System.out.println("开始发送http响应的正文");
        //发送http响应的正文
        int len = 0;
        buffer = new byte[1024];
        try {
            while((len=in.read(buffer)) != -1)
                socketOut.write(buffer, 0, len);

        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("完成发送http响应的正文");
        //睡眠1秒,等待客户接收http响应结果
        Thread.sleep(1000);
        //关闭tcp连接
        socket.close();

    }

}
<!DOCTYPE html>
<html>
  <head>
    <title>hello.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>

  <body>
    This is my HTML page. <br>
  </body>
</html>
时间: 2024-10-07 09:42:17

模拟界面请求到web服务器的相关文章

详谈socket请求Web服务器过程(转)

最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问:众所周知,HTTP协议有两大特性,一个是“无连接”性,一个是“无状态”性.这里的“无连接”岂不是跟上面的说法有冲突?其实这里并没有矛盾,只是人们对“连接”这个词的理解有差异.首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回复的过程: 1)浏览器创建Socket,按给定I

详谈socket请求Web服务器过程

最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问:众所周知,HTTP协议有两大特性,一个是“无连接”性,一个是“无状态”性.这里的“无连接”岂不是跟上面的说法有冲突?其实这里并没有矛盾,只是人们对“连接”这个词的理解有差异.首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回复的过程: 1)浏览器创建Socket,按给定I

socket请求Web服务器过程

最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问:众所周知,HTTP协议有两大特性,一个是“无连接”性,一个是“无状态”性.这里的“无连接”岂不是跟上面的说法有冲突?其实这里并没有矛盾,只是人们对“连接”这个词的理解有差异.首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回复的过程: 1)浏览器创建Socket,按给定I

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

一个简单的Web服务器-支持Servlet请求

上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servlet请求. 像Tomcat,通过解析HTTP报文拿到请求url后,就可以根据web.xml来查找是否有匹配的Servlet,如果有匹配则认定为是一个有效的Servlet请求,然后将request,response传给对应的servlet的service()方法. 这里既然要实现一个简单的Web服务器,

J2EE(一)——开发简单WEB服务器

一.web开发介绍 网页连接过程(B/S):客户端使用浏览器,发送http请求到web服务器上,服务器进行回应.Browser/Server http请求内容: GET/HTTP/1.1 说明是get请求,使用的是http1.1的协议. Accept:image/gif..... 说明我能够接收的图片格式有如下... Accept-Language:zh-cn. 说明我能接收的语言是中文. User-Agent:xxx 说明我能支持的浏览器有xxx. Host:www.baidu.com 说明我

深入浅出web服务器与python应用程序之间的联系

简单来说,Web服务器是在运行在物理服务器上的一个程序,它永久地等待客户端(主要是浏览器,比如Chrome,Firefox等)发送请求.Web 服务器接受 Http Request,返回 Response,很多时候 Response 并不是静态文件,因此需要有一个应用程序根据 Request 生成相应的 Response.这里的应用程序主要用来处理相关业务逻辑,读取或者更新数据库,根据不同 Request 返回相应的 Response.两者之间的桥梁就是WSGI. 一直喜欢研究比较底层的技术,

Java Web学习(1):Web应用程序与Web服务器

一Web应用程序 (1)什么是Web应用程序 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行. Web应用程序一般是B/S模式.Web应用程序首先是应用程序,和用标准的程序语言,如Java.PHP等编写出来 的程序没有什么本质上的不同.然而Web应用程序又有自己独特的地方,就是它是基于Web的,而不是采用传统方法 运行的.换句话说,它是典型的浏览器/服务器架构的产物. 一个W

Servlet和web服务器关系

前面的博客我详细的罗列了下Servlet的常用的类和接口,然后在前面的前面我类似tomcat模拟了一套web服务器,这里来做一个统一的整理,这样子可以更好的把握Servlet,也可以更好的了解下web服务器原理. 第一点: Servlet是一套规范,也就是说其中的一部分的类抽象成了接口,实际过程中Servlet运行在web服务器中,具体的实现要有web服务器来实现,这个和JDBC的驱动一个道理. 在Servlet中,Servlet是一个接口,在Servlet中的init方法用来初始化这个Serv