1.代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace TcpWebserver
{
/// <summary>
/// 基于TcpListener和TcpClient的Web服务器
///
/// 在.net平台下, 为了简化网络编程,.net对套接字又进行了一次封装,
/// 封装后的类是在System.Net.Sockets命名空间下的TcpListener类和TcpClient类,
/// 使用TcpListener类用来监听和接收传入的连接请求,
/// 在该类的构造函数中只需要传递一组网络端点信息就可以准备好监听参数,
/// 而不需要设置使用的网络协议等细节,调用Start方法后,
/// 监听工作就开始(间接调用了Socket.Listen方法),AcceptTcpClient方法将阻塞进程,
/// 直到一个客户端发来连接请求为止,这个方法返回一个封装了Socket的TcpClient对象,
/// 同时从传入的连接队列中删除该客户端的连接请求。此时通过这个TcpClient对象与客户端进行通信。
/// </summary>
class Program
{
static void Main(string[] args)
{
//获得本机IP地址,即127.0.0.1
IPAddress localaddress = IPAddress.Loopback;
//创建可以访问的端点,49155表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲的端口号
IPEndPoint endpoint = new IPEndPoint(localaddress, 49155);
//创建Tcp监听器 端点作为参数 端点是IP和端口号的总称
TcpListener tcpListener = new TcpListener(endpoint);
//启动监听器
tcpListener.Start();
Console.WriteLine("Wait an connect Request...");
while (true)
{
//等待客户连接
TcpClient client = tcpListener.AcceptTcpClient();
if (client.Connected==true)
{
//输出已建立的连接
Console.WriteLine("Created connection");
}
//获得一个网络流对象
//该网络流对象封装了Socket的输入和输出操作
//此时通过对网络流对象进行写入来返回响应消息
//通过对网络流对象进行读取来获得请求消息
NetworkStream netstream = client.GetStream();
//把客户端的请求数据读入保存到一个数组中
byte[] buffer = new byte[2048];
int receivelength = netstream.Read(buffer, 0, 2048);
string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength);
//在服务器端输出请求的消息
Console.WriteLine(requeststring);
//服务器端做出响应内容
//相应的状态行
string statusLine = "HTTP/1.1 200 OK\r\n";
byte[] responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine);
string responseBody = "<html><head><title>Default Page</title></head><body><h1>Welcome you</h1></body></html>";
byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);
string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n",responseBody.Length);
byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
//写入状态行信息
netstream.Write(responseStatusLineBytes,0,responseStatusLineBytes.Length);
//写入回应的头部
netstream.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
//写入回应头部和内容之间的空行
netstream.Write(new byte[] { 13, 10 }, 0, 2);
//写入回应的内容
netstream.Write(responseBodyBytes, 0, responseBodyBytes.Length);
//关闭与客户端的连接
client.Close();
Console.ReadKey();
break;
}
//关闭服务器
tcpListener.Stop();
}
}
}
2.运行Web服务器
3.浏览器访问服务器监听端口