java代码构建简单http服务器和客户端

这篇具有很好参考价值的文章主要介绍了java代码构建简单http服务器和客户端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初识http
a、超文本传输 、应用层的面向对象的协议,概念介绍网上资源一大堆,关键是基于TCP/IP通信协议来传递数据。
b、一开始接触web项目,都是先接触的servlet,tomcat服务器默认实现的一套http规范,提供了基础服务和组件环境,直接拿到请求、构建正文、响应客户端

然而一个http请求包含:
第一行:请求方式(get、post、put、delete)+“空格”+URI+“空格”+http协议版本(0.9、1.0、1.1) eg:GET /hello.html HTTP/1.1
第二行:我们熟悉的请求头Request Head(请求类型、语言、代理、字符集)

http响应:
第一行:http协议版本+“空格”+状态码+”空格“+描述 eg:HTTP/1.1 200 OK
第二行:Response Head(包含Content-Type等)
第三行:响应正文(一般html)
形象化的了解以上结构,打开熟知的浏览器
java代码构建简单http服务器和客户端

构建http server
现在我们由java代码运用ServerSocket tcp协议模拟构建一个http服务:

public class HttpServer {
    
    public static final int DEFAULT_PORT =8080;//默认8080端口

    public static void start(){
        ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(DEFAULT_PORT);
            System.out.println("服务器端正在监听端口:"+serverSocket.getLocalPort());
            while(true){//死循环时刻监听客户端链接
                final Socket socket = serverSocket.accept();
                System.out.println("建立了与客户端一个新的tcp连接,客户端地址为:"+socket.getInetAddress()
                +":"+socket.getPort());
                //开始服务
                service(socket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void service(Socket socket) throws Exception {

        //读取HTTP请求信息
        InputStream socketIn = socket.getInputStream();
        Thread.sleep(500);
        int size = socketIn.available();
        byte[] b = new byte[size];
        socketIn.read(b);
        String request = new String(b);
        System.out.println(request);

        //解析请求方式、uri、协议,获取uri
        String typeUriHttp = request.substring(0,request.indexOf("\r\n"));
        String uri = typeUriHttp.split(" ")[1];
        //简化处理响应头content-Type
        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响应结果
        //创建响应协议、状态
        String httpStatus = "HTTP/1.1 200 OK\r\n";
        //创建响应头
        String responseHeader = "Content-Type:" + contentType + "\r\n\r\n";
        InputStream in = HttpServer.class.getResourceAsStream("/webRoot"+uri);
        OutputStream socketOut = socket.getOutputStream();
        //发送响应协议、状态码及响应头、正文
        socketOut.write(httpStatus.getBytes());
        socketOut.write(responseHeader.getBytes());
        int len =0;
        b = new byte[1024];
        while((len=in.read(b))!=-1){
            socketOut.write(b,0,len);
        }
        Thread.sleep(1000);
        //socket.close();
    }
}

 写一个测试类,主方法启动服务

package Http;

/**
 * Author:varCode
 * Date:2019-03-22 20:55
 * Description:<描述>
 */
public class HttpTest {
    public static void main(String[] args) {
        //开启Http服务端
         HttpServer.start();
    }
}

在我们项目目录的webRoot文件夹下放入可访问的资源,通过浏览器URI(资源定位符)读取服务端资源,打开我们的浏览器,本地ip+默认端口

java代码构建简单http服务器和客户端

脱离tomcat服务环境的一个web访问页面,是有点小意思啊,下面我们再来脱离客户端浏览器

构建http client

package Http;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * Author:varCode
 * Date:2019-03-22 22:20
 * Description:<描述>
 */
public class HttpClient {

    //实现get方式访问http server
    public static void doGet(String host,int port,String uri){
        Socket socket = null;
        try {
            socket = new Socket(host,port);
            //创建http请求  第一行 注意空格
            StringBuffer sb = new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
            //构建请求头
            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");
            //发送http请求
            OutputStream socketOut = socket.getOutputStream();
            socketOut.write(sb.toString().getBytes());
            Thread.sleep(2000);
            InputStream socketIn = socket.getInputStream();
            int size = socketIn.available();
            byte[] b = new byte[size];
            socketIn.read(b);
            //将相应结果输出到控制台 模拟浏览器界面
            System.out.println(new String(b));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 再来一个客户端测试类:要先启动上述的HttpTest服务测试类,再运行下面客户端主程序测试:

package Http;

/**
 * Author:varCode
 * Date:2019-03-22 22:41
 * Description:<描述>
 */
public class ClientTest {
    public static void main(String[] args) {
        //客户端发请求
        HttpClient.doGet("localhost",8080,"/weather.html");
    }
}

且将控制台当作页面打印如下:

java代码构建简单http服务器和客户端

好了,至此完全可以由HttpClient客户端类——>HttpServer服务类上请求及响应,可以由浏览器——>HttpServer发送请求(上面已经测试了),HttpClient——>tomcat来相应请求(有兴趣的可以自己来,tcp协议只能监听一个端口的主机服务,开启tomcat,关闭HttpServer测试类)
浏览器和tomcat都是实现了http规范,都能解析请求和构建响应,更何况tomcat还是java编写的服务器 文章来源地址https://www.toymoban.com/news/detail-496085.html

到了这里,关于java代码构建简单http服务器和客户端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(19)
  • Nginx HTTP/3服务器-客户端环境搭建

    一、 NGINX 服务器介绍: NGINX是一个高性能的开源Web服务器,也可用作反向代理服务器、负载均衡器和HTTP缓存。它由俄罗斯的程序员Igor Sysoev创建,并于2004年首次公开发布。NGINX的设计重点是高性能、高并发和低内存消耗,使其成为了现代Web架构中的关键组件之一。 NGINX的一些

    2024年03月11日
    浏览(15)
  • HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

    HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

    HTTP协议 是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(www.world wide web)服务器传输超文本到本地浏览器的传送协议 HTTP 是基于TCP/IP(三次握手,四次挥手)通信协议来传输数据(HTML文件,图片文件,查询结果等) TCP:可靠的,丢包重传 UTP:不可靠的,直播,

    2024年02月05日
    浏览(18)
  • 使用Netty构建TCP和UDP服务器和客户端

    Netty是一个基于Java NIO实现的网络通信框架,提供了高性能、低延迟的网络通信能力。使用Netty构建TCP和UDP服务器和客户端非常简单,下面是一个简单的示例代码: 构建TCP服务器 构建TCP客户端 构建UDP服务器 构建UDP客户端   上述示例代码中,分别定义了一个TCP服务器、TCP客户

    2024年02月16日
    浏览(13)
  • Python网络编程实战:构建TCP服务器与客户端

    Python网络编程实战:构建TCP服务器与客户端 在信息化时代,网络编程是软件开发中不可或缺的一部分。Python作为一种功能强大的编程语言,提供了丰富的网络编程库和工具,使得开发者能够轻松构建各种网络应用。本文将详细介绍如何在Python中进行网络编程,特别是如何使用

    2024年04月15日
    浏览(13)
  • 使用Go语言的HTTP客户端和服务器

    使用Go语言的HTTP客户端和服务器

    使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持,使得创建HTTP客户端和服务器变得简单。 首先,让我们来看一下如何创建一个简单的HTTP服务器。在Go中,可以使用 net/http 包来创建HTTP服务器。以下是一个简单的示例

    2024年01月16日
    浏览(31)
  • Netty示例教程:结合Spring Boot构建客户端/服务器通信

    当涉及到在客户端/服务器应用程序中使用Netty进行通信时,以下是一个结合Spring Boot的示例教程,演示如何使用Netty构建客户端和服务器应用程序。 简介 本教程将指导您如何使用Netty结合Spring Boot构建客户端和服务器应用程序。通过Netty的可靠网络通信功能,您可以轻松构建高

    2024年02月15日
    浏览(50)
  • netty构建udp服务器以及发送报文到客户端客户端详细案例

    netty构建udp服务器以及发送报文到客户端客户端详细案例

    目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代码中

    2024年04月09日
    浏览(14)
  • QT实现客户端服务器HTTP(get请求、post请求)

    QT实现客户端服务器HTTP(get请求、post请求)

    服务器代码如下: QtHttpForS.h QtHttpForS.cpp main.cpp QtHttpForS.ui 客户端代码: QtHttpForC.h QtHttpForC.cpp mian.cpp QtHttpForC.ui 程序运行效果: GET请求: POST请求: POST请求使用postman测试: 注意: 可以发现,在使用postman进行POST请求发送时,服务器接收到的请求头与QTSocket的POST请求的请求头

    2023年04月22日
    浏览(15)
  • 基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    基于Spring Boot2.0 & HTTP/2 实现服务器、客户端

    HTTP协议由于其无状态的特性以及超高的普及率,是当下大部分网站选择使用的应用层协议。然而,HTTP/1.x的底层传输方式的几个特性,已经对应用的整体性能产生了负面影响。特别是,HTTP/1.0在每次的TCP连接上只允许发送一次请求,在HTTP/1.1中增加了请求管线,但是这仅仅解决

    2023年04月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包