当前位置: 首页 > news >正文

.net的socket示例

概述

最近因为项目需要,必须自己实现一个HTTP服务器的部分功能。

需求大概是这样的,winform里使用webrowser控件显示一个本地的html页面,同时winform启动http服务,本地html页面里通过javascript使用XMLHttpRequest对象向winform进行http通信,交互数据。

现在,该项目功能基本实现了,把HTTP服务器部分提取出来分享一下,并提供相关源码下载。

HTTP服务器开发教程

启动HTTP服务器代码,创建Socket侦听端口

        public void Start(string ip = "127.0.0.1"int port = 80)

        {

            _IP = ip;

            _Port = port;

            Stop();

            _Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPAddress ipaddress = IPAddress.Parse(_IP);

            IPEndPoint endpoint = new IPEndPoint(ipaddress, _Port);

            _Listener.Bind(endpoint);

            _Listener.Listen(int.MaxValue);

            _Thread = new Thread(new ThreadStart(ThreadHandler));

            _Thread.Start();

        }

开启一个线程,接收请求的Socket,并且用HttpRequest对象封装处理请求的Socket

        private void ThreadHandler()

        {

            while (true)

            {

                Socket s = _Listener.Accept();

                HttpRequest request = new HttpRequest(this, s);

                request.Start();

            }

        }

每个HttpRequest开启一个新线程处理Socket的发送和接收

        public void Start()

        {

            _Thread = new Thread(new ThreadStart(ThreadHandler));

            _Thread.Start();

        }

 

        private void ThreadHandler()

        {

            if (_Server.TraceInConsole)

                Console.WriteLine("Begin HttpRequest...");

            try

            {

                while (true)

                {

                    string receive = Receive();

                    if (!string.IsNullOrEmpty(receive))

                    {

                        _Server.ReadRequest(this, receive);

 

                        string response = _Server.GetResponse(this);

                        int write = Send(response);

 

                        _Server.ResponseFinished(this);

 

                        while (true)

                        {

                            Thread.Sleep(3000);

                            write = Send(HttpServer.BYTES_CRLF);

                            if (_Client == null)

                                break;

                        }

                    }

                    if (_Client == null)

                        break;

                    Thread.Sleep(1000);

                }

            }

            catch (Exception ex)

            {

                if (_Server.TraceInConsole)

                    Console.WriteLine(ex.Message);

            }

            if (_Server.TraceInConsole)

                Console.WriteLine("End HttpRequest...");

        }

处理HTTP请求,默认是返回http404错误,在GetResponse添加自定义http处理

        public virtual string GetResponse(HttpRequest request)

        {

 

            return ResponeNotFound(request.Version);

        }

        public string ResponeNotFound(string version)

        {

            return version + @" 404 Not Found

Content-Length: 0

Content-Type: text/plain

Server: Hunk's http server

Date: Fri, 06 Aug 2010 14:00:23 GMT

 

";

        }

处理Socket关闭,TIME_WAIT状态

如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源。

服务端尝试发送数据,利用SocketExeception判断客户端Socket是否已关闭连接,然后关闭服务端Socket。

            while (true)

            {

                Thread.Sleep(3000);

                write = Send(HttpServer.BYTES_CRLF); //如果发送失败,_Client会被关闭并且设置为null

                if (_Server.TraceInConsole)

                    Console.WriteLine("Try To End HttpRequest...");

                if (_Client == null)

                    break;

            }

注:只提点主要的位置,详细请下载源码。

HTTP服务器和客户端的效果图

源码下载地址

http://download.csdn.net/source/2602863


from:http://blog.csdn.net/hunkcai/article/details/5794625

相关文章:

  • Xcode添加百度移动统计报错处理
  • Java在Web开发语言上败给了PHP
  • Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
  • 我的阅读编程书籍的好方法
  • 使用WampServer在本地玩转WordPress
  • 苹果不允许 iOS 应用内置购买(IAP)使用第三方支付方式,那么跨平台的支付怎么解决这个问题?
  • 判断NSString中是否包含空格
  • Unity3D中文视频教程【超清+精选】
  • cocos2d-x跨平台之路(观点比较清晰)
  • Unity、Cocos2d-2x、UDK 等手机游戏开发引擎分别有什么特性,适合开放哪些类型的游戏?
  • Unity 这个 3D 引擎很厉害吗?听说可以完成各种终端的游戏研发?
  • Mac系统下MonoDevelop界面乱码及不能显示中文
  • 《编程回忆录》之 Unity3D 视频教程
  • 技术人员如何去面试?
  • 不要在init和dealloc函数中使用accessor
  • CEF与代理
  • CSS盒模型深入
  • eclipse(luna)创建web工程
  • HTTP中的ETag在移动客户端的应用
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Mysql数据库的条件查询语句
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • npx命令介绍
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • spring boot下thymeleaf全局静态变量配置
  • vue 配置sass、scss全局变量
  • vue--为什么data属性必须是一个函数
  • 基于Android乐音识别(2)
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 系统认识JavaScript正则表达式
  • 小试R空间处理新库sf
  • 学习JavaScript数据结构与算法 — 树
  • 最近的计划
  • ​【已解决】npm install​卡主不动的情况
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #if 1...#endif
  • (1)bark-ml
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (层次遍历)104. 二叉树的最大深度
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计ssm电影分享网站
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)JAVA中的堆栈
  • (转)人的集合论——移山之道
  • (转)四层和七层负载均衡的区别
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...