Socket

Posted wudequn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();

        }

 

技术分享图片

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

 下载代码





以上是关于Socket的主要内容,如果未能解决你的问题,请参考以下文章

Python干货socket中的listen()参数(数字)到底代表什么?

paper 78:sniff抓包程序片段

通过 c# 与 socket.io 服务器通信

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js