跟随上次的socket sever,追加Tcplistener、Httplistener的server
一、Tcplistener搭建web server
1、同socket类似,Tcplistener其实是对socket的封装,方便编程,先初始化tcplistener并且开始监听
- //初始化端点信息
- IPAddress address = IPAddress.Loopback;
- IPEndPoint endPoint = new IPEndPoint(address, );
- //初始化并启动监听器
- TcpListener server = new TcpListener(endPoint);
- server.Start();
- Console.WriteLine("Start listening...\n");
2、然后在一个循环中加上监听到的Tcpclient进行相应处理。在这里,与socket不同,Tcplistener将监听到的请求返回成NetworkStream对象
方便程序员编程,使用流的方式进行读写即可
- while (true)
- {
- //挂起并接受请求
- TcpClient client = server.AcceptTcpClient();
- Console.WriteLine("Create a connection.");
- //获取网络流对象
- NetworkStream ns = client.GetStream();
- //使用utf8转码
- System.Text.Encoding utf8 =System.Text.Encoding.UTF8;
- byte[] request = new byte[];
- int length = ns.Read(request, , );
- string requestString = utf8.GetString(request, , length);
- Console.WriteLine(requestString);
- //初始化状态行
- string statusLine = "HTTP/1.1 200 OK\r\n";
- byte[] statusLineBytes = utf8.GetBytes(statusLine);
- //初始化回应的主体
- string responseBody = "<html><head><title>From Server</title></head><body><h1>Server Test [TcpListener]</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);
- //回传信息
- ns.Write(statusLineBytes,,statusLineBytes.Length);
- ns.Write(responseHeaderBytes, , responseHeaderBytes.Length);
- ns.Write(new byte[] { , }, , );
- ns.Write(responseBodyBytes, , responseBodyBytes.Length);
- //关闭TcpClient对象,回收资源
- client.Close();
- if (Console.KeyAvailable)
- break;
- }
- server.Stop();
3、至此,web server搭建完成
二、基于HttpListener搭建Web Server
1.在.net命名空间System.Net中提供了HttpListener类,该类使用Http.sys系统组件方可工作,故应先检查系统是否支持。初始化HttpListener对象并开始监听
- //查看系统是否支持
- if (!HttpListener.IsSupported)
- throw new System.InvalidOperationException("Your system must be winXP or Server 2003 or later");
- string[] prefixes = new string[] { "http://localhost:23333/" };
- //初始化HttpListener
- HttpListener listener = new HttpListener();
- foreach (string str in prefixes)
- listener.Prefixes.Add(str);
- //开启监听
- listener.Start();
- Console.WriteLine("Start listening...\n");
2.调用GetContext获取上下文对象,并从该对象解析出request及response。通过request的诸如HttpMethod,AcceptTypes,UserLanguages,UserAgent,Headers等属性获取请求信息。通过设置response相关属性配置回发的相关信息。使用标准流对象将回应回发出去
- while (true)
- {
- //阻塞线程知道请求到来
- HttpListenerContext context = listener.GetContext();
- //获取请求信息
- HttpListenerRequest request = context.Request;
- Console.WriteLine("{0} {1} HTTP/1.1",request.HttpMethod,request.RawUrl);
- Console.WriteLine("Accept:{0}", string.Join(",", request.AcceptTypes));
- Console.WriteLine("Accept-Encoding:{0}", request.Headers["Accept-Encoding"]);
- //获取response对象
- HttpListenerResponse response = context.Response;
- //初始化回应主体
- string responseString = @"<html><head><title>From HttpListener Server</title></head><body><h1>Server Test[HttpListener]</h1></html>";
- //初始化回应内容、长度、编码
- response.ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(responseString);
- response.ContentType = "text/html;charset=UTF-8";
- //输出回应内容
- System.IO.Stream output = response.OutputStream;
- System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
- writer.Write(responseString);
- //关闭输出流
- writer.Close();
- if (Console.KeyAvailable)
- break;
- }
- listener.Stop();
3.演示完成
跟随上次的socket sever,追加Tcplistener、Httplistener的server的更多相关文章
- Socket聊天室-TcpListener,TcpClient
参考自:http://blog.csdn.net/liguo9860/article/details/6148614 服务端:
- 【socket】一分钟理清 socket udpsocket tcpsocket tcplistener TCPClient和 UDPClient
socket 套接字接口是各种语言tcp udp的网络操作的基础. 直接用socket 对象开发 可以选择 udpsocket 或者 tcpsocket ,两者在使用上仅一些方法和参数不同,所有的底 ...
- winform socket编程之TCPListener
运行结果: 服务端代码 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- Python Socket Sever
1. Server code 1 # !/usr/bin/env python 2 # coding:utf-8 3 import multiprocessing 4 import socket 5 ...
- C Socket Programming for Linux with a Server and Client Example Code
Typically two processes communicate with each other on a single system through one of the following ...
- 【Socket计划】使用C++实现Server结束Client结束
我是在Visual Stdio 2013两人的建立project.编译如下两个人main文件,然后测试 服务器:Server.cpp #include <WINSOCK2.H> #incl ...
- Socket编程实践(4) --多进程并发server
1.Socket地址复用 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); in ...
- C# socket实践 - 简易版FTP(Server & Client)
写了个简易版的ftp(服务器和客户端),运行效果如下图: click download下载中的UI: 原理:模仿正规ftp方式,分成2个socket连接:文本命令socket.数据信道socket. ...
- socket 建立网络连接,client && server
client代码: package socket; import java.io.IOException; import java.net.Socket; /** * 客户端_聊天室 * * @aut ...
随机推荐
- Django后台设置--遇到的问题与解决方案
1. 后台如何管理项目中的models 新建的Django工程会自动引用admin 应用,新建后台可以通过 createsuperuser 命令建立后台admin超级管理员,我遇到的第一个问题,就是如 ...
- 为什么使用 Containjs 模块化管理工具效率高?
为什么使用 Containjs 模块化管理工具效率高? 要说明这个首先得说明一下,Containjs 的模块加载原理. 第一步,首先使用异步加载(ajax)在 js 目录下的 app.js 入口模块( ...
- mariadb 长链接时间限制导致队列消费进程崩溃
项目是一个数据同步项目,线下Android客户端把本地sqllite数据提交到云端队列,php做守护进程消费队列,以同步数据.初测没有问题,可是时不时出现诡异的崩溃,因为设置了错误邮件报警,发现错误代 ...
- POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 2
➤NO.30<移动的力量>[推荐人]刘九如:电子工业出版社副社长兼总编辑邬贺铨:中国工程院院士.原副院长汪力成:华立集团董事局主席➤NO.31<智慧社会>[推荐人]段永朝:财讯 ...
- 10 分钟学会Linux常用 bash命令
目录 基本操作 1.1. 文件操作 1.2. 文本操作 1.3. 目录操作 1.4. SSH, 系统信息 & 网络操作 基本 Shell 编程 2.1. 变量 2.2. 字符串替换 2.3. ...
- js实现文本框溢出文字用省略号(...)表示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 打印pid,写着玩。
#include <stdio.h> #include <string.h> #include <dirent.h> #include <limits.h&g ...
- Reflux中文教程——概览
翻译自github上的reflux项目,链接:https://github.com/reflux/refluxjs 〇.安装及引入 安装: npm install reflux 引入: var Ref ...
- 少走弯路——Android对话框AlertDialog.Builder使用方法简述
android的自定义对话框,不需要通过继承的方式来实现,因为android已提供了相应的接口Dialog Builder ,下面就是 样例: new AlertDialog.Builder(this ...
- css中auto的用法
—什么是auto? +auto是自适应的意思,auto是很多尺寸值的默认值,也就是由浏览器自动计算. +块级元素中margin.border.padding以及content宽度之和构成父元素widt ...