Socket API使用——模拟http协议

news/2024/11/7 9:38:37/

Socket API使用——模拟http协议

简单的c/s程序——服务端实例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SocketServer {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8080);System.out.println("tomcat 服务器启动成功");ExecutorService threadPool = Executors.newFixedThreadPool(3);while (!serverSocket.isClosed()){Socket request=serverSocket.accept();threadPool.execute(()->{try {InputStream inputStream=request.getInputStream();System.out.println("收到请求");BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));String msg=null;while ((msg=reader.readLine())!=null){if(msg.length()==0){break;}System.out.println(msg);}System.out.println("----------------end");} catch (IOException e) {throw new RuntimeException(e);}});}}
}

这是一个简单的c/s架构的程序如果直接通过浏览器进行访问会出现如下情况
在这里插入图片描述
控制台输出如下信息
在这里插入图片描述
因为缺少访问的协议,所以访问时浏览器不能正常访问
那么我们先从http协议看起

http协议——请求数据包解析

在这里插入图片描述

http协议——响应数据包解析

在这里插入图片描述

简单模拟http服务

通过对数据包的解析,我们就可以通过服务端进行模拟响应结果
首先是需要填写响应的协议的版本号和状态码
http/1.1 200 OK
然后是响应给客户端的长度
Content-length: 11
最后是响应的内容如:
hello world

实现


import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SocketServer {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8080);System.out.println("tomcat 服务器启动成功");ExecutorService threadPool = Executors.newFixedThreadPool(3);while (!serverSocket.isClosed()){Socket request=serverSocket.accept();threadPool.execute(()->{try {InputStream inputStream=request.getInputStream();System.out.println("收到请求");BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));String msg=null;while ((msg=reader.readLine())!=null){if(msg.length()==0){break;}System.out.println(msg);}System.out.println("----------------end");//接收数据后模拟http返回结果OutputStream outputStream=request.getOutputStream();outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());outputStream.write("Content-Length: 11\r\n\r\n".getBytes());//响应内容outputStream.write("hello world".getBytes());outputStream.flush();} catch (IOException e) {throw new RuntimeException(e);}});}}
}

在这里插入图片描述
响应成功


http://www.ppmy.cn/news/885871.html

相关文章

win10语言不能安装计算机,重装win10打不了字?用这招,一下子就搞定

原标题:重装win10打不了字?用这招,一下子就搞定 最近有网友咨询小编有关win10不能打字的问题。有位小伙伴在安装了win10系统之后,使用不了中文汉字。还有一位小伙伴在重装系统过程中,输入不了字。根据这两种情况&#…

【NI USRP】每一个USRP是如何命名的呢,和原厂Ettus型号有什么关联呢?

详细的硬件配置,非常有助于设备的选型。 如果您采购了X310子板,是可以将其转化为对应的USRP型号的设备。 B系列 EttusNI-USRP频段最大带宽通道B200mini无70 MHZ - 6 GHZ56 MHz1X1B200mini-i无70 MHZ - 6 GHZ56 MHz1X1B205mini-i无70 MHZ - 6 GHZ56 MHz…

复习第六课 C语言-排序,初识指针

目录 【1】冒泡排序&#xff08;从小到大&#xff09; 【2】选择排序 【3】二维数组 【4】指针 【5】指针修饰 【6】大小端 【7】初见二级指针 练习&#xff1a; 【1】冒泡排序&#xff08;从小到大&#xff09; #include <stdio.h> //数组哪里的\0?自己和字符串…

小3乐三国杀,智能手机会免费吗?

小米与乐视一直相爱相杀&#xff0c;不过二者之间的矛盾从来没有像今天这么激烈。小米重兵杀入乐视擅长的电视和内容领域&#xff0c;乐视则以挑衅者姿态推出手机&#xff0c;与小米在中高端市场狭路相逢。正在发生的围绕影视内容的口水战&#xff0c;只是两个互联网硬件巨头对…

相机图像质量研究(2)ISP专用平台调优介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【监控系统】Prometheus监控组件Node-Exporter配置实战

这一节&#xff0c;我们来配置一下Node-Exporter&#xff0c;那么我们先来了解一下什么是Prometheus的Exporter&#xff1f; 任何向Prometheus提供监控样本数据的程序都可以被称为一个Exporter&#xff0c;它是一种用于将不同数据源的指标提供给Prometheus进行收集和监控的工具…

db2事务日志满,或者日志磁盘空间已满解决办法

概念&#xff1a; 事务日志满指当前事务无法写入到活动日志中&#xff08;主日志文件和辅助日志文件已全部用完或者没有足够当前事务写入的空间&#xff09; 日志磁盘空间已满指辅助日志文件还未使用完&#xff0c;磁盘空间已经满了。 db2数据库事务日志文件分为主日志文件和…

No space left on device 解决Linux系统磁盘空间满的办法

No space left on device 原因是磁盘空间满了 1.查看是否存在未被清除句柄的僵尸文件。这些文件实际上已经被删除&#xff0c;但是有服务程序在使用这些文件&#xff0c;导致这些文件一直被占用&#xff0c;无法释放磁盘空间。如果这些文件过多&#xff0c;会占用很大的磁盘空…