自己如何实现简单的http服务器

【网络进阶】HTTP服务器(一) 本文主要讨论了HTTP服务器的相关知识,首先介绍了HTTP的概念,阐述了其基于客户端/服务器架构的工作原理。接着,文章分析了在使用HTTP过程中需要注意的事项,以及HTTP消息的结构,包括客户端请求消息和服务器响应消息。文章还通过一个具体的GET方法示例,详细说明了如何在HTTP中传递数据。此外,文章列举了常见的HTTP请求方法以及它们的作用,以表格形式展示了各种HTTP响应头信息及其含义。通过阅读本文,您将对HTTP服务器有一个全面的了解,为日常工作和学习中的应用提供参考。 阅读详情

文件名:MyHttpServerTest.java

import java.io.* ;
import java.net.* ;
import java.util.* ;

/**
 * main
 */
public class MyHttpServerTest{

 String m_szServerName;//server name
 String m_szVersion;//server version
 int m_nServerPort;//port
 
 public MyHttpServerTest(String szServerName,String szVersion,int nServerPort){
  this.m_szServerName =szServerName;
  this.m_szVersion =szVersion;
  this.m_nServerPort=nServerPort;
 }
 
 /**
  * show version information
  */
 public void showServerInformation(){
  System.out.println("欢迎使用Newman的HTTP服务器!");
  System.out.println("Server Name   : "+this.m_szServerName);
  System.out.println("Server Version: "+this.m_szVersion  );
 }
 
 public void start (){
  this.showServerInformation();

  try{
   ServerSocket server=new ServerSocket(this.m_nServerPort );
   while(true){
    Socket client=server.accept();
    (new HttpClientThread(client)).run();
   }
  }
  catch(Exception e){
   e.printStackTrace();
      System.exit(1);
  }
 
 }
 
 public static void main(String args[]){
  MyHttpServerTest server=new MyHttpServerTest("MyHttpServerTest","1.0",80);
  server.start();   
 } 
}

class HttpClientThread implements Runnable {
 Socket m_sClient;
 HTTPRequest m_Request;
 
 HttpClientThread(Socket sClient)throws IOException{
  this.m_sClient =sClient;
  this.m_Request =new HTTPRequest(this.m_sClient );
 }
 
 public void run(){
  try{
   System.out.println(this.getConnectInfo());
   BufferedOutputStream out=new BufferedOutputStream(this.m_sClient .getOutputStream ());   
   System.out.println( this.m_Request.getLog());

   if(this.m_Request.isGetRequest())
    this.processGetRequest(this.m_Request,out);
   System.out.println("Request completed. Closing connection.");
   this.m_sClient .close ();   
  }
  catch(IOException e){
   System.out.println("IOException occurred .");
      e.printStackTrace();
  }  
 }

 /**
  * get Connect Info
  */
 public String getConnectInfo(){
  String szClientHostName=this.m_sClient .getInetAddress().getHostName ();
  String szClientAddress=this.m_sClient .getInetAddress ().getHostAddress();
  int ClientPort=this.m_sClient .getPort ();
  String szRet="";
  szRet="Accepted connection from "+szClientHostName+"("+szClientAddress+") "+"on port "+ClientPort+".";
  return szRet;
 }

 void processGetRequest(HTTPRequest request,BufferedOutputStream out)throws IOException {
  String szFileName=request.getFileName ();
  File file=new File (szFileName);
  
  if(file.exists ())
   this.sendFile (out,file);
  else{//文件不存在时
   
   System.out.println ("File "+file.getCanonicalPath()+" does not exist.");   
   String notfound="<html><head><title>Not Found</title></head><body><h1>"+
       "Error 404-file not found</h1><p>"+
       "File Name: "+file+" not found"+"<br>"+
       "<a href=index.htm>Return Index</a>"+
       "</body></html>";    

   file://out.write(new String("HTTP/1.0 404 no found").getBytes ());
   out.write (new String ("HTTP/1.0 200 OK/r/n").getBytes ());
   out.write(new String("Content_Length:"+notfound.length()+2).getBytes());
   out.write(new String("Content_Type:text/html/r/n/r/n").getBytes ());    
   out.write(new String(" ").getBytes());
   out.write(notfound.getBytes ());
   out.flush();
  }
 }
 
 void sendFile(BufferedOutputStream out,File file){
  try{
   DataInputStream din=new DataInputStream (new FileInputStream (file ));
   int len=(int)file.length();
   byte buffer[]=new byte [len];
   din.readFully (buffer);
   din.close();
   out.write (new String ("HTTP/1.0 200 OK/r/n").getBytes ());
   out.write (new String ("Content-Length:  "+buffer.length +"/r/n").getBytes ());
   out.write (new String ("Content-Type: text/html/r/n/r/n").getBytes ());
   out.write (buffer);
   out.flush ();
   out.close ();
   System.out.println("File sent: "+file.getCanonicalPath());   
   System.out.println("Number of bytes: "+len);
  }
  catch(Exception e){
   try{
       out.write(("HTTP/1.0 400 " + "No can do" + "/r/n").getBytes());
       out.write("Content-Type: text/html/r/n/r/n".getBytes());
      }
      catch(IOException ioe){
       System.out.println("Error retrieving "+file);
   }  
  }
 }
}

 Vector m_vLines=new Vector ();
 Socket m_sClient;
 HttpInputStream m_In;
 
 HTTPRequest(Socket client)throws IOException{
  this.m_sClient =client;
  this.m_In =new HttpInputStream(this.m_sClient.getInputStream());
  this.getRequest ();
 }

 public String getLog(){
  StringBuffer szRet=new StringBuffer() ;
  szRet.append ("Received the following request:"+"/n");
  
  Enumeration enum=m_vLines.elements ();
  String szstr1="";
  while(enum.hasMoreElements()){
   szstr1=(String)enum.nextElement();
   szRet.append (szstr1+"/n");
  }
  return szstr1.toString();
 }
 
 boolean isGetRequest() {
  if(this.m_vLines .size ()>0){
   String firstline=(String)this.m_vLines.elementAt (0);
   if(firstline.length ()>0)
    if(firstline.substring(0,3).equalsIgnoreCase ("GET"))
     return true;
  }
  return false; 
 }
 
 String getFileName() {
  if(this.m_vLines .size ()>0){
   String firstline=(String)this.m_vLines.elementAt (0);
   String filename=firstline.substring (firstline.indexOf (" ")+1);
   int n=filename.indexOf (" ");
   
   if(n!=-1)
    filename=filename.substring (0,n);
   
   try{
    if(filename.charAt(0)=='/' )
     filename=filename.substring (1);
   }
   catch(StringIndexOutOfBoundsException ex){
   }
   
   if(filename.equals (""))
    filename="index.htm";
   if(filename.charAt (filename.length ()-1)=='/')
    filename+="index.htm";//not understand
   return filename;
  }
  else
   return "";
 }
 
 public HttpInputStream getInputStream(){
  return this.m_In ; 
 }
 
 public HTTPRequest getRequest() throws IOException {    
  String line;
  while(true){
   line=this.m_In.readLine ();      
   
   if(line.length ()>0)
    this.m_In.addLine(line);
   else
    break;
  }
  return this;
 }
 
 
/**
 * only use to recognize methed "get"
 */
class HttpInputStream extends FilterInputStream {
 HttpInputStream(InputStream in){
  super(in);
 }
 
 public void addLine(String line) {
  m_vLines .addElement(line);
 }
 
 public String readLine() throws IOException {
  StringBuffer result=new StringBuffer ();       
  boolean finished=false;
  boolean isenter=false;
 
  while(!finished){
   int ch=-1;
   ch=read();   
   
   if((isenter)&&(ch==10)){// if it is "/n/r"
    result.setLength(result.length()-1);//had added "/n",remove it
    return result.toString ();
   }
   
   if(ch==13)//if enter pressed
    isenter=true;
   else
    isenter=false;

   if(ch==-1)//end
    return result.toString ();
   else
    result.append ((char)ch);   
  }
  return result.toString ();
 } 
}
}

请多指教

在 C++ 中实现一个简单的 HTTP 服务器 在现代软件开发中,HTTP 服务器是网络应用程序的核心组成部分。虽然有许多现成的 HTTP 服务器可供使用,但了解如何从头开始实现一个简单的 HTTP 服务器可以帮助我们更好地理解网络编程和 C++ 的特性。在本文中,我们将逐步实现一个简单的 HTTP 服务器,支持基本的 GET 请求。 阅读详情

相关推荐

Linux C 实现简单的HTTP服务器

要实现HTTP服务器,首先要了解HTTP请求报文格式和HTTP相应报文格式 HTTP请求报文 HTTP响应报文 HTTP方法 GET:获取资源 POST:传输实体主体 POST 主要目的不是获取资源,而是传输实体主体数据。 GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分。 ...

wwxy1995的博客 3713

ESP32基础应用之HTTP 服务器

esp32 HTTP 服务器的操作

while(1) 4516

【计算机网络】HTTP协议以及简单的HTTP服务器实现

HTTP协议以及简单的HTTP服务器实现

qq_67582098的博客 1999

什么是http服务器

本篇文章旨在从服务器后台开发的角度剖析一个简单的http服务器的运行原理. 我们知道浏览器是http(s)的客户端,目的是连接远程的http服务器,然后服务器返回浏览器数据.浏览器接收数据解析数据之后展现出来.我们看到的外在表现就是,浏览器访问一个url,然后就得到相应的web页面. 同样我们知道,浏览器与http服务器是通过http协议,传输层是tcp协议,因为他是有连接,可靠的协议.关于h...

入门菜鸟程序员的成长 4万+

视频动作识别、行为识别、时空动作检测数据集整理(持续更新)

动作、行为、事件 在计算机视觉的相关研究中,人体的动作、行为识别是一个基础研究问题。但目前识别、检测人类的动作/行为仍然是一个巨大的挑战。这里整理下当前相关的细分任务、数据集和开源代码(持续更新中)。

人工智能算法与工程实践 3万+

数据包络分析(超效率-SBM模型)附python代码

超效率-SBM模型超效率SBMpython代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了。 上阵子挺多人私信我,原谅我记性不好,可能没有回复全。 这篇文章是超效率的扩展。 超效率SBM SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。 上篇文章说到super-SBM的一个模型,公式为: 这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为: python代码(部分) 在编程过程中,本来我以为第一个模型是无

weixin_43217288的博客 3万+

Http服务器搭建

http 超文本传输协议 Hypertext Transfer Protocol协议: 主要是用在网页传输上,网站访问上使用传输的数据是明文的,可以被截获,查看里面的内容--》不够安全经常用于 web架构: c/s client --》serverhttp端口号 80https 是http协议的加密版本 Hypertext Transfer Protocol Secure数据传输是经过加密的,比较安全https端口是 443。

m0_70752498的博客 4967

STC15单片机实战项目软件开发第四讲 - 按键检测(状态机)

软件开发第四讲 - 按键检测(状态机) 一、工具链接 1、Keil c51 UV4 https://yunpan.360.cn/surl_yrIfYYmeRFk 2、STC-ISP下载软件 https://yunpan.360.cn/surl_yxH4CuUUvI3 二、学习板获取方式 方法1:自己设计PCB,自行打板焊接; 方法2:用群主设计的PCB,自行打板焊接; 方法3:向群主购买,淘宝链接...

硬件家园 3045

HTTP服务器(一)HTTP服务器入门介绍

一、简介 1.1、做项目的时候,要请求REST服务器。而FEST服务器还是用http基本原理(即阉割版)来请求。 1.2、请求端口EndPoint/请求方法Method/请求内容格式ContentType/请求的数类型PostData(一般为JSon格式)。 1.3、我们熟悉的HTTP、FTP、Telnet等协议都是建立在TCP/IP协议基础上的。 但是,我不知道JSon格式是什么东西,所...

xpj8888的博客 3273

Silvaco Atlas入门指南——从零开始掌握半导体器件仿真

本文为Silvaco Atlas半导体器件仿真软件的入门指南,详细介绍了从零开始掌握该工具的核心流程。内容涵盖Atlas的基本概念、仿真流程、核心文件(输入、结构、输出文件)、交互式与批处理两种操作模式,并逐步演示了如何从定义网格、划分区域、设置电极到进行掺杂、选择物理模型并求解,最终获取和分析器件特性的完整步骤。旨在帮助微电子相关专业人员和工程师快速上手这一强大的“数字实验室”,提升半导体器件设计与研发效率。

weixin_29306317的博客 399

基于角谱传播的MATLAB仿真:从相位恢复看自由空间光传播

本文详细介绍了基于角谱传播理论的MATLAB仿真方法,用于模拟自由空间光传播过程。通过傅里叶光学原理,将光场分解为频谱并应用传播相位滤波器,实现了从纯相位物体到可观测衍射图样的仿真。文章结合具体代码,演示了如何利用角谱法进行相位恢复,为计算成像和生物医学检测等领域的研究提供了实用的仿真工具和思路。

weixin_29055699的博客 279

http协议详解及简单的http服务器实现

http协议及简单的http服务器的实现

HanSion.Z 1万+

第十七章:载板成本结构分析

本文分析了ABF和BT载板的成本结构,其中ABF载板材料成本占比50%(主要来自ABF薄膜),制造成本35%,利润15%;BT载板材料成本45%,制造成本40%。ABF薄膜价格预计将从2023年的80-90美元/panel上涨至2026年的120-150美元。良率每提升1%可降低成本约5%,产能利用率每提高10%可降本3-5%。通过设计优化(如减少层数)、工艺改进(提升良率)和供应链优化(材料国产化)可有效降低成本。预计2024-2028年AI用ABF载板成本将上涨10-15%,而手机用BT载板涨幅约5%。

Open 314

C++ 实现简单Http服务器

实现一个简单的Http服务器,基于windows 平台。 总共五个文件 : HttpServer.hpp、HttpServer.cpp、Utils.hpp、Utils.cpp、main.cpp Utils.hpp #include <vector> #include <string> #include <iostream> using namespace std; void splitStr(const string& s, vector<string

哲学天空的博客 4220

【人工智能之深度学习】12. BERT微调实战:医疗文本分类的领域自适应技巧与工业级实现

摘要:医疗文本分类是自然语言处理在医疗健康领域的核心应用,可辅助疾病诊断、病历结构化和医疗质量监控。然而,医疗文本的专业术语密集、实体关系复杂及数据长尾分布等特性,导致通用BERT模型性能受限。本文系统阐述医疗文本分类的领域自适应技术,从理论原理到工业级实现展开全流程讲解。首先分析医疗文本的独特属性及技术挑战;随后详解领域继续预训练、适配器微调、对抗训练等核心技术的数学原理;构建包含数据预处理、模型优化、隐私保护的完整实战架构;通过疾病分类、情感分析、事件检测三大案例验证技术有效性。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1004

MFC属性网格控件(CMFCPropertyGridCtrl)完全指南:构建专业属性编辑界面

本文详细介绍了MFC中的CMFCPropertyGridCtrl控件的使用方法。主要内容包括:控件基础用法(初始化、添加属性、事件处理)、高级设置(自定义外观、创建属性类型、动态更新)、派生类实现(自定义绘制、搜索过滤功能)、界面集成技巧(对话框布局、属性编辑器)以及实际应用示例。文章重点讲解了如何通过继承和自定义实现复杂功能,并提供了性能优化、多语言支持等最佳实践方案。该控件适用于需要大量参数配置的应用程序,能够创建类似Visual Studio属性窗口的专业界面。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 154

基于Java实现简单Http服务器之一

        本文将详细介绍如何基于java语言实现一个简单的Http服务器,文中将主要介绍三个方面的内容:1)Http协议的基本知识、2)java.net.Socket类、3)java.net.ServerSocket类,读完本文后你可以把这个服务器用多线程的技术重新编写一个更好的服务器。         由于Web服务器使用Http协议通信的因此也把它叫做Http服务器,Http使用可靠

mingjava的专栏 4952

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 简单实现HTTP服务器

HTTP服务器   解释: 个人理解,http服务器就是解析http请求信息,并解析信息;然后根据信息做后续事情。   Http请求格式与响应格式      核心代码     package com_2.Httpserver; import java.io.BufferedReader; import java.io.IOException; import java.i...

Dachuan 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++简单实现http协议服务器和客户端

C++ 简单实现HTTP GET/POST 请求 HTTP(超文本传输协议)是一种客户端与服务端的传输协议,最早用于浏览器和服务器之间的通信,后来因为其使用灵活、方便等特点,广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议,同时以C++方式分别实现HTTP GET、POST 请求 HTTP 请求报文 HTTP请求报文的一般格式由4部分组成:请求行、请求头部、空行、请求数据。如...

u011555996的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

实现简单的HTTP服务器

原文章:Python的学习(十四)---- 实现简单的HTTP服务器 用Python实现简单的HTTP服务器 用于搭建http server的模块有如下三种: 1)BaseHTTPServer:提供基本的Web服务和处理器类,分别是HTTPServer及BaseHTTPRequestHandler; 2)SimpleHTTPServer:包含执行GET和HEAD请求的SimpleHTTPRequestHandler类; 3)CGIHTTPServer:包含处理POST请求和执行的CGIHTTPRequest

31楼下小黑的博客 737

一个C实现的简单HTTP服务器

理解了 HTTP 服务器的基本原理掌握了 Linux 下 Socket 编程流程实现了一个能返回静态文件的 HTTP 服务器为后续扩展打下坚实基础。

2301_80137352的博客 1289

简单HTTP服务器实现

   我们这里实现一个简单的HTTP服务器,无论浏览器向我们请求什么数据,我们都返回一个hello world    //实现最简单的http服务端程序 //返回hello world //http是应用协议,在传输层使用的是tcp协议所以我们的程序本质上是tcp服务器 //我们http指定监听10000端口,所以在请求访问的时候也要手动指定否则默认80端口 #include&lt;std...

Hanani_Jia的博客 2334

Qt实现简单的Http服务器

Qt实现简单的Http服务器

mikasoi的博客 2453

java实现http服务器_JAVA实现简单HTTP服务器

学习用Java模拟完成一个简单的HTTP服务器,加深对HTTP服务过程的理解。Socket客户端套接字(也可以就叫“套接字”),套接字是两台机器之间的通信端点,是源IP地址和目的IP地址以及源端口号和目的端口号的组合,一般用于标识客户端请求的服务器和服务,是支持TCP/IP的网络通信的基本操作单元。一个Socket由一个IP地址和一个端口号唯一确定。在Java环境下,Socket编程主要是指基于T...

weixin_34596480的博客 997

用Java实现一个简单的HTTP服务器(一)HTTP

用Java实现一个简单的HTTP服务器(一)一、HTTP协议简介二、HTTP工作原理三、HTTP请求方法四、HTTP状态码五、URL六、HTTP请求协议七、HTTP响应协议总结 简介:这学期报了计网创新的创新实验,在机房做基于交换机和路由器的计网实验。最近正在学Java,想用Java实现一个简单的HTTP服务器,接下来就是我的心路历程. 一、HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。

MrsYoutiao的博客 2555

基于python的简单HTTP服务器实现(一)

HTTP协议 请求报文 请求头部字段解析 响应报文 响应头部字段解析 响应状态码 HTTP服务器实现 - TCP通信部分 http协议大概是我们接触的最多的协议了,每打开一个网页,浏览器和服务器之间,使用的就是HTTP协议。HTTP协议属于应用层协议,下一层是运输层。这段时间,学习了一些相关的知识,因为对C++的多线程和网络编程不是很熟悉,先用python实现了...

新安浅滩的博客 5万+
上一篇: 用VJ++实现FTP的功能
下一篇: 在JAVA应用程序中如何实现FTP的功能
newman0708
博客等级 码龄25年 32粉丝 26原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值