当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面:

    1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET。

    2)数据通信的类型,常见的数据报(SOCK_DGRAM)、数据流(SOCK_STREAM)。

    3)使用的网络协议,比如:TCP协议。

在同一个网络地址上,为了区分使用相同协议的不同应用程序,可以为不同的应用程序分配一个数字编号,这个编号称为网络端口号(port)。端口号是一个两字节的证书,取值范围从0~65535。IANA(Internet Assigned Number Authority,互联网地址分配机构)维护了一个端口分配列表,这些端口分三类,第一类的范围是0~1023,称为众所周知的端口,由IANA进行控制和分配,由特定的网络程序使用,例如,TCP协议使用80号端口来完成HTTP协议的传输。第二类的范围是1024~49151,称为登记端口,这些端口不由IANA控制,但是IANA委会了一个登记的列表,如果没有在IANA登记的话,也不应该在程序中使用。但是大多数的系统中,在没有冲突的情况下,也可以有用户程序使用。第三类的范围是49152~65535,称为动态或者似有端口号,这些端口可以由普通用户程序使用。

对于一个网络应用程序来说,通过地址、协议和端口号可以唯一地确定网络上的一个应用程序。其中地址和端口的组合称为端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。

在.NET中,System.Net命名空间提供了网络编程的大多数数据类型以及常用操作,其中常用的类型如下:

    1)IPAddress类用来表示一个IP地址。

    2)IPEndPoint类用来表示一个IP地址和一个端口号的组合,称为网络的端点。

    3)System.Net.Sockets命名空间中提供了基于Socket编程的数据类型。

    4)Socket类封装了Socket的操作。

常用的操作如下:

    1)Listen:设置基于连接通信的Socket进入坚挺状态,并设置等待队列的长度。

    2)Accept:等待一个新的连接,当新连接到达的时候,返回一个指针对新连接的Socket对象。通过新的Socket对象,可以与新连接通信。

    3)Receive:通过Socket接受字节数据,保存到一个字节数组中,返回实际接受的字节数。

    4)Send:通过Socket发送预先保存在字节数组中得数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;//
using System.Net.Sockets;// namespace 基于Socket的最简单Web服务器
{
class Program
{
static void Main(string[] args)
{
IPAddress address = IPAddress.Loopback;//取得本机的loopback网络地址,即127.0.0.1
IPEndPoint endPoint = new IPEndPoint(address, );//创建可访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket,使用IPv4地址,数据通信类型为字节流,TCP协议
socket.Bind(endPoint);//将socket绑定到一个端点上
socket.Listen();//设置连接队列的长度
Console.WriteLine("开始监听,端口号:{0}",endPoint.Port );
while (true)
{
Socket client = socket.Accept();//开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的请求连接
Console.WriteLine(client.RemoteEndPoint);//输出客户端的地址
byte[] buffer = new byte[];//准备读取客户端请求的数据,读取的数据将保存在一个数组中
int length = client.Receive(buffer, , SocketFlags.None);//接受数据
//将请求数据翻译为UTF-8
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
string requestString = utf8.GetString(buffer, , length);
Console.WriteLine(requestString);//显示请求
//回应的状态行
string statusLine = "HTTP/1.1 200 OK\r\n";
byte[] statusLineBytes = utf8.GetBytes(statusLine);
//准备发送回客户端的网页
string responseBody = "<html><head><title>From Socket Server</title></head><body><h1>Hello world.<h1></body></html>";
byte[] responseBodyBytes = utf8.GetBytes(responseBody);
//回应的头部
string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n",responseBody.Length );
byte[] responseHeaderBytes = utf8.GetBytes(responseHeader); //向客户端发送状态信息
client.Send(statusLineBytes);
//向客户端发送回应头
client.Send(responseHeaderBytes);
//头部与内容的分隔行
client.Send(new byte[]{,});
//向客户端发送内容部分
client.Send(responseBodyBytes); //断开与客户端的连接
client.Close();
if (Console.KeyAvailable)
break;
}
socket.Close();
}
}
}

简易web服务器的更多相关文章

  1. [js高手之路]node js系列课程-创建简易web服务器与文件读写

    web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...

  2. 手写简易WEB服务器

    今天我们来写一个类似于Tomcat的简易服务器.可供大家深入理解一下tomcat的工作原理,本文仅供新手参考,请各位大神指正!首先我们要准备的知识是: Socket编程 HTML HTTP协议 服务器 ...

  3. 自己实现一个简易web服务器

    一个web服务器是网络应用中最基础的环节. 构建需要理解三个内容: 1.http协议 2.socket类 3.服务端实现原理 1.1 HTTP http请求 一般一个http请求包括以下三个部分: 1 ...

  4. 写一个简易web服务器、ASP.NET核心知识(4)--转载

    第一次尝试(V1.0) 1.理论支持 这里主要要说的关于Socket方面的.主要是一个例子,关于Socket如何建立服务端程序的简单的代码. static void Main(string[] arg ...

  5. Linux程序设计综合训练之简易Web服务器

    1.功能需求: (1)学习网络套接字编程.HTPP协议.Web服务器等知识: (2)设计一简单Web服务器,提供静态网页浏览服务功能. 2.实现的功能: (1)C语言实现基于socket的Web服务器 ...

  6. 【教程】手写简易web服务器

    package com.littlepage.testjdbc; import java.io.BufferedReader; import java.io.FileReader; import ja ...

  7. 写一个简易web服务器、ASP.NET核心知识(4)

    前言 昨天尝试了,基于对http协议的探究,我们用控制台写了一个简单的浏览器.尽管浏览器很low,但是对于http协议有个更好的理解. 说了上面这一段,诸位猜到我要干嘛了吗?(其实不用猜哈,标题里都有 ...

  8. 简易web服务器(java版)

    //直接使用 ServerSocket 监听服务器端口,就能实现web服务器package ThreadPoolTest; import java.io.InputStream; import jav ...

  9. 实现简易Web服务器(c语言)

    任务: (1)实现服务器与客户端间的通信. (2)可以实现HTTP请求中的GET方法. (3)提供静态网页浏览功能,如可浏览:HTML页面,无格式文本,常见图像格式等. (4)提供可以传递参数的动态网 ...

随机推荐

  1. ASP.NET 初识Cookie

    1.ASP.NET中使用Cookie 0.说明 Cookie存在客户端电脑上,Session存在服务器上,所以保存登录信息等敏感信息时不能使用Cookie,用户个性化设置可以使用Cookie 1.新建 ...

  2. 第三篇:爬虫框架 - Scrapy

    前言 Python提供了一个比较实用的爬虫框架 - Scrapy.在这个框架下只要定制好指定的几个模块,就能实现一个爬虫. 本文将讲解Scrapy框架的基本体系结构,以及使用这个框架定制爬虫的具体步骤 ...

  3. flash数据交互

    新随笔 联系 订阅 管理 随笔 - 14  文章 - 5  评论 - 0 安卓中webview读取html,同时嵌入Flex的SWF,交互 安卓activity与html交互很简单,用javascri ...

  4. 【BZOJ1899】午餐(动态规划)

    [BZOJ1899]午餐(动态规划) 题面 BZOJ 题解 我太弱了 这种\(dp\)完全做不动.. 首先,感性理解一些 如果所有人都要早点走, 那么,吃饭时间长的就先吃 吃饭时间短的就晚点吃 所以, ...

  5. C++学习-8

    1.注意:函数指针前面*,&都是一样的没啥实际意义,除了把实例化函数块的时候,需要指针或者引用修饰    cout << typeid(my1.show).name() <& ...

  6. fitnesse - 用例创建编辑、管理、执行和日志

    fitnesse - 用例创建编辑.管理.执行和日志 2017-10-09 目录 1 用例创建编辑  1.1 用例创建  1.2 用例编辑2 用例管理3 用例测试执行和日志  3.1 用例测试执行  ...

  7. handsontable 事件汇总

    Hook插件 afterChange (changes: Array, source: String):1个或多个单元格的值被改变后调用 changes:是一个2维数组包含row,prop,oldVa ...

  8. Android消息机制解析

    我们知道在编程时许多操作(如更新UI)需要在主线程中完成,而且,耗时操作(如网络连接)需要放在子线程中,否则会引起ANR.所以我们常使用Handler来实现线程间的消息传递,这里讨论的也就是Handl ...

  9. MySQL多数据源笔记4-Mycat中间件实战

    Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务.由于前面讲的对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集 群构成了整个完整的 ...

  10. 【前端单元测试入门04】Karma

    Karma 官方介绍 A simple tool that allows you to execute JavaScript code in multiple real browsers. 即一个允许 ...