首页 > 编程语言 >C# 通过socket 实现HTTP

C# 通过socket 实现HTTP

时间:2024-02-18 15:34:13浏览次数:26  
标签:HTTP socket C# 22% Send message GetBytes

http是最常用的互联网协议。http协议是基于tcp协议的,今天我打算使用C#语言,基于tcp编程自己实现http。适用于linux及mac系统。windows的tcp编程我没使用,但原理都是一样的。如果对网络编程不熟悉的,可以先熟悉一下网络编程。通过此例子,一定会对http协议的理解更上一层楼。

首先得有一个socket套接字,并且绑定到需要使用的端口上进行监听。

var socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
          
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 1018);
socket.Bind(localEndPoint);//绑定
socket.Listen(1000);  //开始监听  

 

然后我们就可以接收客户端的请求了。我采用了死循环。

   while (true)
   {
       // 监听端口
       ProcessAccept(socket.Accept());
   }


// 监听的具体方法
private static void ProcessAccept(Socket s) { try { byte[] data = new byte[1024]; var len = s.Receive(data); string request = Encoding.Default.GetString(data, 0, len); if (!string.IsNullOrWhiteSpace(request)) { if (request.Contains("GET / HTTP/1.1")) { int pageLen = 0; // 返回响应结果 s.Send(GetBytes("HTTP/1.1 200 OK\r\n")); //返回首部 s.Send(GetBytes("Content-Type: text/html\r\n")); s.Send(GetBytes("Connection: Keep-Alive\r\n")); s.Send(GetBytes($"Content-Length: {htmlPage.Length}\r\n")); // 发送换行符 表示结束 s.Send(GetBytes("\r\n")); s.Send(GetBytes(htmlPage)); } else if (request.Contains("/on")) { // 返回响应结果 s.Send(GetBytes("HTTP/1.1 200 OK\r\n")); //返回首部 s.Send(GetBytes("Content-Type: application/octet-stream\r\n")); s.Send(GetBytes("Connection: Keep-Alive\r\n")); s.Send(GetBytes($"Content-Length: {"On".Length}\r\n")); // 发送换行符 表示结束 s.Send(GetBytes("\r\n")); s.Send(GetBytes("On")); } else { s.Send(System.Text.Encoding.UTF8.GetBytes("ERROR Request")); } } } catch (SocketException ex) { //TODO 异常处理 } s.Close(); }

 

就是不停的调用accept去接受客户端的连接,accept会阻塞函数的执行,当有tcp客户端连接到来的时候它才会返回。accept函数的返回值是一个新的socket套接字。这个套接字是专门用来和该连接的客户端交互的。每个客户端都会有一个专门的套接字。

http请求数据包括请求行,消息头,消息正文三部分,而响应数据同样包括响应行,响应头,响应正文三部分。主要需要的是换行需要用\r\n表示还有就是有和正文之间有一个空行。   这里贴一下我测试时浏览器发来的请求数据
GET / HTTP/1.1\r\n
Host: 127.0.0.1\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
sec-ch-ua: \"Google Chrome\";v=\"105\", \"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"105\"\r\n
sec-ch-ua-mobile: ?0\r\n
sec-ch-ua-platform: \"macOS\"\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Sec-Fetch-Site: none\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\n
Sec-Fetch-Dest: document\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22182d98f2ee11c1-032ff8224617bd2-1b525635-1296000-182d98f2ee2192d%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22url%E7%9A%84domain%E8%A7%A3%E6%9E%90%E5%A4%B1%E8%B4%A5%22%2C%22%24latest_search_keyword%22%3A%22url%E7%9A%84domain%E8%A7%A3%E6%9E%9

我给客户端回复的响应数据如下

    string message ="";
    message+="HTTP/1.1 200 OK\r\n";                                    //响应行
    message+="Content-Type:text/html\r\n";                             //响应头
    message+="server:Tengine \r\n";                                    //响应头
    message+="name:LiaoKun \r\n";                                      //响应头
    message+="\r\n";                                                   //空行
    message+="<html><head>Hello,World!</head></html>\r\n";             //正文

 

效果如下:

 

完整代码:  https://gitee.com/dxqInterNet/socket_-http.git

 

标签:HTTP,socket,C#,22%,Send,message,GetBytes
From: https://www.cnblogs.com/dxqNet/p/18019374

相关文章

  • Topaz DeNoise AI:一键让照片重获清晰 mac/win版
    TopazDeNoiseAI是一款革命性的图片降噪软件,它利用先进的人工智能算法,帮助用户轻松去除照片中的噪点,恢复图像的清晰度和细节。无论是专业摄影师还是摄影爱好者,TopazDeNoiseAI都能成为他们处理图片时的得力助手。→→↓↓载TopazDeNoiseAImac/win版 该软件的核心优势在......
  • 初中英语优秀范文100篇-083My Low-carbon Life-我的低碳生活
    PDF格式公众号回复关键字:SHCZFW083记忆树1Theenvironmentalpollutionisworseandworsetoday.翻译今天的环境污染越来越严重简化记忆污染句子结构主语Theenvironmentalpollution这是句子的主要讨论对象,指的是“环境污染”。谓语is连接主语和表语,表示主......
  • C#调用python开发的方法
    一、可以通过使用IronPython库来实现,首先需要安装IronPythonNuGet包,然后导入相关命名空间。接下来,我们创建了一个Python运行时引擎对象,并使用该引擎加载并编译指定路径下的Python文件(也可以直接传递Python代码作为字符串)。最后,我们可以像调用其他C#方法一样调用Python函数,将结果......
  • ABC341
    Elink这个题目中所说的好的其实就是像\(010101\)这样一个\(0\),一个\(1\)的字符串。那么不好的就是两个\(0\)或两个\(1\)在一起,所以判断一个区间好不好只需要判断一个区间内有没有两个\(0\)或两个\(1\)在一起,那么我们可以把两个\(0\)或两个\(1\)在一起的位置存下来。先考虑查......
  • [Some Tricks] 自动取模类
    consti128o=1;template<i64mod,i64invpow=mod-2>structModular{u64M=(o<<64)/mod;i64query(i64x){u64x_=1ull*x;u64q=1ull*(((i128)(M)*(i128)(x_))>>64);u64r=x_-q*(1ull*mod......
  • 如何将桌面文件从C盘改到其他位置
    1、打开此电脑,找到左侧的桌面并点击鼠标右键 2、点击属性 3、点击上方的位置,然后点击下方的移动按钮,选择需要存放的文件地址 4、点击应用就完成了  ......
  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......
  • 【c&c++】cJSON详解
    一、JSON概述1.1JSON介绍JSON:JavaScript对象表示法(JavaScriptObjectNotation)。是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似C语音家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON......
  • 关于lodash.debounce的配置
    最近在改一个bug的时候反馈说一个弹窗表单在快速多次的点击提交按钮时有可能重复提交,于是我在检查这个表单的时候发现他的防抖是这样配置的:submit1:debounce(function(){console.log(1);this.cancel(true);},500),乍一看好像没什么问题,于是我查询了文档 l......
  • /vendor/etc/fstab.qcom
    CN:/#cat/vendor/etc/fstab.qcom#Androidfstabfile.#Thefilesystemthatcontainsthefilesystemcheckerbinary(typically/system)cannot#specifyMF_CHECK,andmustcomebeforeanyfilesystemsthatdospecifyMF_CHECK#TODO:Add'check'......