热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#Web服务器学习(一)

(1)usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Ne

(1)

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;


namespace WebServer
{
    class Program
    {
        static void Main(string[] args)
        {
            //获取本机ip的地址
            IPAddress localaddress = IPAddress.Loopback;
            IPEndPoint endpoint = new IPEndPoint(localaddress, 49155);
            // 创建Socket对象,使用IPv4地址,数据通信类型为数据流,传输控制协议TCP协议.  
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //socket绑定到断点上
            socket.Bind(endpoint);
            //设置链接队列的长度
            socket.Listen(10);
            while (true)
            {
                Console.WriteLine("wait an connect....");
                Socket clientsockets = socket.Accept();


                Console.WriteLine("Client adress is:{0}", clientsockets.RemoteEndPoint);
                byte[] buffer = new byte[2048];
                int receivelength = clientsockets.Receive(buffer, 2048, SocketFlags.None);
                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= "

liu peng

";
                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);
                byte[] respOnseBodyBytes= Encoding.UTF8.GetBytes(responseBody);


                // 向客户端发送状态行  
                clientsockets.Send(responseStatusLineBytes);


                // 向客户端发送回应头信息  
                clientsockets.Send(responseHeaderBytes);


                // 发送头部和内容的空行  
                clientsockets.Send(new byte[] { 13, 10 });


                // 想客户端发送主体部分  
                clientsockets.Send(responseBodyBytes);


                // 断开连接  
                clientsockets.Close();
                Console.ReadKey();
                break;
            }
            // 关闭服务器  
            socket.Close();
        }
    }
}


(2)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;


namespace TcpWebserver
{
    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 监听器
            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= "

Welcome you

";
                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);
                byte[] respOnseBodyBytes= Encoding.UTF8.GetBytes(responseBody);


                // 写入状态行信息
                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();
        }
    }

}

启动exe,然后在网页输入地址http://localhost:49155/  可以看到效果


推荐阅读
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在C#编程中,枚举是一种非常实用的数据类型,能够有效提高代码的可读性和维护性。本文详细探讨了枚举在实际开发中的多种应用场景,包括状态管理、配置选项和数据分类等,并通过具体示例展示了如何高效地使用枚举来简化代码逻辑。此外,还介绍了枚举的一些高级用法,如自定义属性和扩展方法,以进一步增强其功能和灵活性。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 在分析Socket服务器程序接收中文数据时出现的乱码问题时,我们发现客户端使用C#编写的数据在返回时能够正常显示。本文详细探讨了该问题的成因,并提出了一种有效的解决方案。通过调整字符编码设置和优化数据传输格式,确保了中文数据在传输过程中的完整性与正确性。具体实现代码包括对Socket读取事件的处理,确保数据以正确的编码格式进行解析和显示。 ... [详细]
author-avatar
米饭2502912051
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有