使用Java socket简单模拟HTTP服务器

2023-11-17

1、HTTP  server

接收client端的http请求并将同级目录的root/?返回

package httpDemo;

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

public class HttpServer {

	public static void main(String[] args) {
		int port;
		ServerSocket serverSocket;
		
		try {
			port=Integer.parseInt(args[0]);
		} catch (Exception e) {
			System.out.println("port=8080 (default)");
			port=8080;
		}

		try {
			serverSocket=new ServerSocket(port);
			System.out.println("server is running on port:"+serverSocket.getLocalPort());
			while (true) {
				try {
					final Socket socket=serverSocket.accept();
					System.out.println("biuld a new tcp link with client,the cient address:"+
							socket.getInetAddress()+":"+socket.getPort());
					service(socket);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public static void service(Socket socket)throws Exception{
		//read http information
		InputStream socketIn=socket.getInputStream();
		Thread.sleep(500);
		int size=socketIn.available();
		byte[] buffer=new byte[size];
		socketIn.read(buffer);
		String request=new String(buffer);
		System.out.println(request);
		
		//
		//get http request first line
		String firstLineOfRequest=request.substring(0, request.indexOf("\r\n"));
		String[] parts=firstLineOfRequest.split(" ");
		String uri=parts[1];
		
		//mime
		String contentType;
		if(uri.indexOf("html")!=-1||uri.indexOf("htm")!=-1)
			contentType="text/html";
		else {
			contentType="application/octet-stream";
		}
		
		//create http response
		//the first line
		String responseFirstLine="HTTP/1.1 200 OK\r\n";
		//http response head
		String responseHeade="Content-Type:"+contentType+"\r\n";
		
		//send http response result
		OutputStream socketOut=socket.getOutputStream();
		//send http response first line
		socketOut.write(responseFirstLine.getBytes());
		//send http response heade
		socketOut.write(responseHeade.getBytes());
		
		InputStream in=HttpServer.class.getResourceAsStream("root/"+uri);
		//send content
		socketOut.write("\r\n".getBytes());
		int len=0;
		buffer=new byte[128];
		if (in!=null) {
			while((len=in.read(buffer))!=-1){
				System.out.println(new String(buffer));
				socketOut.write(buffer,0,len);
			}
		}
		
		Thread.sleep(1000);
		//close tcp link
		socket.close();
	} 
}

2、HTTP client

   负责连接服务端socket并建立http连接发送请求

package httpDemo;

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

public class HttpClient {

	public static void main(String[] args) {
		// forsure http request uri
		String uri="index.htm";
		if (args.length!=0) {
			uri=args[0];
		}
		doGet("localhost",8080,uri);
		
	}

	private static void doGet(String host, int port, String uri) {
		Socket socket=null;
		try {
			socket=new Socket(host,port);
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			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("User-Agent: HTTPClient\r\n");
			sb.append("Host: localhost:8080\r\n");
			sb.append("Connection: Keep-Alive\r\n");
			
			//send http request
			OutputStream socketOut=socket.getOutputStream();
			socketOut.write(sb.toString().getBytes());
			
			Thread.sleep(2000);//sleep 2s ,wait response
			
			//recieve
			InputStream socketIn=socket.getInputStream();
			int size=socketIn.available();
			byte[] buffer=new byte[size];
			socketIn.read(buffer);
			System.out.println(new String(buffer));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				socket.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

}

当使用HTTPClient访问HTTPServer时候,server端控制台打印:

biuld a new tcp link with client,the cient address:/127.0.0.1:62722
GET index.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: HTTPClient
Host: localhost:8080
Connection: Keep-Alive
<html>
<h1>oooooooooooopppppppppppppppppppp</h1>
</html>
client端打印:

biuld a new tcp link with client,the cient address:/127.0.0.1:62722
GET index.htm HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: HTTPClient
Host: localhost:8080
Connection: Keep-Alive
<html>
<h1>oooooooooooopppppppppppppppppppp</h1>
</html>

当使用火狐浏览器访问HTTPServer时候,server端控制台打印:

port=8080 (default)
server is running on port:8080
biuld a new tcp link with client,the cient address:/127.0.0.1:62351
GET /index.htm HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=7AF11CBE9CF2A52BE339FD670E706B61
Connection: keep-alive
Cache-Control: max-age=0
浏览器页码返回如下:

只要遵守相同的规则(HTTP),就能够互相交流。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Java socket简单模拟HTTP服务器 的相关文章

随机推荐

  • 计算机符号链接是什么意思,Windows或Linux上的符号链接(符号链接)完整指南

    想要轻松地从不同的文件夹访问文件夹和文件 而不保留重复的副本 以下是如何使用Symbolic Links链接Windows 10 8 7 Vista XP和Ubuntu中的任何内容 那么什么是符号链接呢 符号链接 也称为符号链接 基本上是高
  • Python开发环境配置

    安装Anaconda Anaconda是Python的一个科学计算发行版 内置了数百个Python经常会使用的库 也包括做机器学习或数据挖掘的库 如Scikit learn NumPy SciPy和Pandas等 其中可能有一些是Tenso
  • YOLOv5行人检测

    YOLOv5行人检测 1 数据准备 1 下载数据集 2 整理出jpg和xml 2 进行YOLOV5的部署训练 1 划分数据集 2 生成yolo的txt文件 3 配置自己数据集的文件 4 聚类找anchors 5 配置模型文件 6 训练模型
  • 如何修复引导/错误代码0xc000000f

    现象 安装完系统后启动时报文件丢失 文件 okldr mbr 或者 scldr mbr 等错误 状态 0xc000000f 处理办法 1 用U盘做一个PE启动盘 可以用 U大侠 小白一键重装等 2 bios启动选项选择U盘启动 3 重启电脑
  • Mysql实战45讲 - 学习笔记

    Sql流程 一条查询语句的执行过程一般是经过连接器 分析器 优化器 执行器等功能模块 最后到达存储引擎 大体来说 MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器 查询缓存 分析器 优化器 执行器等 涵盖
  • SSM框架整合layui之实现登录功能

    SSM框架整合layui之实现登录功能 代码 UserService接口 UserServiceImpl实现类 SUserMapper接口 SUserMapper xml SystemController login jsp 代码 User
  • 缓存淘汰算法 —— LFU-Aging(Java实现)

    Java实现 用HashMap保存关系 key值 命中次数与上次命中时间 当需要淘汰某个key值时 调用map remove key import java util public class LFUAgingMap
  • 决策树之ID3的matlab实现

    森林内的两条分叉路 我选择了人迹罕见的一条 从此一切变得不一样 佛洛斯特Robert Frost 目录 一 决策树介绍 1 1 相关概念 1 2 图形表示 1 3 规则表示 二 决策树的信息计算 三 ID3相关介绍 3 1 ID3算法概述
  • 超参数和验证集

    感知机是神经网络的基础 对于形式上完全相同的感知机 模型参数不同 可以实现不同的运算 因此 可以通过训练学习模型参数来形成不同的功能 这也是人工神经网络具有强大学习能力的基础 例如下图这个简单得感知机来说 模型参数取不同的值 就实现了不同的
  • 与Android对接注册接口的session会话取值为null问题

    与Android对接注册接口的session会话取值为null问题 问题 最近在改造一个springboot项目时在后端写好登录接口后 Android调用登录成功后 调用其他接口时发现获取session为null 经过swagger一番测试
  • 一次prime1靶场红队渗透实战,从主机发现到Linux内核漏洞提权

    前言 相比于如DVWA pikachu等靶场 完整系统的靶场更突出一个 无目的性 和 复杂性 就好似一个密室逃脱游戏 存在着离谱的漏洞也存在着奇怪的提示 但是真实的渗透测试就是一个无目的的过程 当你在迷宫中走一遭 那么当你下一次遇见复杂的路
  • 1361: [蓝桥杯2018初赛]乘积尾零

    蓝桥杯2018省赛A组第3题 题目链接http oj ecustacm cn problem php id 1361 思路 找出2 5的个数 取最小的即可 include
  • Redis五大数据类型使用——String

    1 String 字符串 添加 查询 追加 获取长度 判断是否存在的操作 C Users 12559 gt redis cli exe 启动redis 127 0 0 1 6379 gt set name kobe 插入一个key为 nam
  • [附源码]java毕业设计高校学生疫情防控信息管理系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 【JavaWeb】Thymeleaf的简介与使用

    Thmeleaf MVC 为什么需要MVC 我们之前在书城项目第二阶段做登录的时候 曾经提出过优化登录失败后的处理 虽然说可以实现在登录失败之后跳转回到登录页面 并且展示失败信息 但是代码实在是太恶心了 根本没法维护 所以我们需要将视图展示
  • 【转】深度强化学习的加速方法

    原文地址 https www matools com blog 190533310 Accelerated methods for deep reinforcement learning 论文解读 深度强化学习一直以来都以智能体训练时间长
  • openGauss学习笔记-07 openGauss 语法

    文章目录 openGauss学习笔记 07 openGauss 语法 7 1 帮助 7 2 SQL语句格式 7 3 SQL语法 ABORT ALTER AUDIT POLICY ALTER DATA SOURCE ALTER DATABAS
  • Android实现图片点击放大

    第一步 查看大图 implementation com github SherlockGougou BigImageViewPager v4 6 1 1 第二步 在图片点击事件里调用 ImagePreview getInstance 上下文
  • 【mybatis】【mybatisPlus】

    springboot 下 mybatis mybatisPlus Mybatis的作用 配置数据源和mybatis的配置 Mybatis的作用 Mybatis就是帮助程序员将数据存取到数据库里面 MyBatis 是一个半自动化的ORM框架
  • 使用Java socket简单模拟HTTP服务器

    1 HTTP server 接收client端的http请求并将同级目录的root 返回 package httpDemo import java io InputStream import java io OutputStream imp