模拟界面请求到web服务器

Posted 笨笨莱鸟学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟界面请求到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>

 

以上是关于模拟界面请求到web服务器的主要内容,如果未能解决你的问题,请参考以下文章

模拟web请求——简单的小程序提高工作效率

Web后端语言模拟http请求(带用户名和密码)实例代码大全

前端面试题之手写promise

转asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端

在哪里以及如何使用片段填充我的标签

经验总结20--C#模拟WEB请求