zoukankan      html  css  js  c++  java
  • .net core Socket

    Socket是什么

     

    实际上socket是对TCP/IP协议的封装,它的出现只是使得程序员更方便地使用TCP/IP协议栈而已。socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)。更加方便程序员使用传输层

    TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
    这个就像操作系统会提供标准的编程接口,比如win32编程接口一样。
    TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”

    HTTP是轿车,提供了封装或者显示数据的具体形式;。
    Socket是发动机,提供了网络通信的能力。

    实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。

    https://blog.csdn.net/github_34606293/article/details/78230456

     --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    应用层  http/https

      http作用,  解决了一个数据包装的问题

      http报文  request报文  response报文   报文都是严格的格式约束

    传输层   socket(tcp/ip协议)  tcp  udp

      解决了数据如何在网络中传输的问题。。 (面向连接还是非连接的)

    网络层 ip

    socket服务器

    //AddressFamily 地址类型。采用IP4
    //SocketType  传输数据类型
    //ProtocolType 协议类型
    static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
    public static void Start()
    {
        socket.Bind(new IPEndPoint(IPAddress.Any, 8002));
    
        socket.Listen(100);
    
        //接收客户端的 Socket请求   第一个参数是一个委托,第二个参数是第一个参数的参数
        socket.BeginAccept(OnAccept, socket);
    
        Console.WriteLine("当前web服务器启动成功,端口号为:8002");
    }
            public static void OnAccept(IAsyncResult ar)
            {
                var serverSocket = ar.AsyncState as Socket;
    
                //客户端socket
                var clientSocket = serverSocket.EndAccept(ar);
    
                //服务端进行下一步监听
                serverSocket.BeginAccept(OnAccept, serverSocket);
    
    
                var bytes = new byte[1000];
                //获取客户端socket内容
                var len = clientSocket.Receive(bytes);
                //转化正字符串
                var request = Encoding.UTF8.GetString(bytes, 0, len);
    
    
                var response = string.Empty;
    
                if (!string.IsNullOrEmpty(request) && !request.Contains("favicon.ico"))
                {
                    // /1.html
                    var filePath = request.Split("
    ")[0].Split(" ")[1].TrimStart('/');
    
                    //获取文件内容
                    response = System.IO.File.ReadAllText(filePath, Encoding.UTF8);
                }
    
                Console.WriteLine(request+"标识执行了");
    
                //按照http的响应报文返回
                var responseHeader = string.Format(@"HTTP/1.1 200 OK
    Date: Sun, 26 Aug 2018 03:33:36 GMT
    Server: nginx
    Content-Type: text/html; charset=utf-8
    Cache-Control: no-cache
    Pragma: no-cache
    Via: hngd_ax63.139
    X-Via: 1.1 tjhtapp63.147:3800, 1.1 cbsshdf-A4-2-D-14.32:8101
    Connection: keep-alive
    Content-Length: {0}
    
    ", Encoding.UTF8.GetByteCount(response));
    
                //返回给客户端了 可以多次返回
                clientSocket.Send(Encoding.UTF8.GetBytes(responseHeader));
                clientSocket.Send(Encoding.UTF8.GetBytes(response));
    
                clientSocket.Close();
    
            }

    一个也会可能会有多次请求。

     下载代码

  • 相关阅读:
    Azure终于支持大容量虚拟机了-最高32核,448G内存
    Windows Azure 不能ping通的解决方案
    一个使用微软Azure blob实现文件下载功能的实例-附带源文件
    从技术角度看云计算的特点
    DNS记录
    转载:Vue相关开源项目库汇总(史上最全)
    SSL CA
    MVC 5 中启用Session
    2015年的JavaScript:Angular之类的框架将被库取代
    sql server 2014 express
  • 原文地址:https://www.cnblogs.com/wudequn/p/10222959.html
Copyright © 2011-2022 走看看