Socket API使用——模拟http协议

文章展示了如何使用Java的SocketAPI创建一个简单的C/S程序,模拟HTTP服务器。服务端接受连接并读取请求,然后解析HTTP请求数据包。在接收到请求后,程序模拟HTTP响应,包括设置协议版本、状态码、内容长度,并返回响应内容如helloworld。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
                }
            });

        }
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

样子的木偶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值