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(); }
一个也会可能会有多次请求。