每当服务端接受到客户端的命令消息后及时回传接到指令并开拍卖。都见面多聊少接触接触到电脑网络。

 

(3)发起http请求发送请求报文

鉴于客户端发起,客户端组装好要报文,向服务端发送HTTP请求,HTTP由定点的格式,具体想看下图:

图片 1

HTTP请求报文

HTTP请求报文由3片组成(请求行+请求头+请求体),这三片段还有温馨之组装格式,这里虽不详细说明了。

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

namespace ConsoleApplication7
{
    /// <summary>
    /// Socket Helper
    /// </summary>
    public class SocketHelper
    {
        private string ip;
        private IPEndPoint ex;
        private Socket socket;

        public SocketHelper(string ip, int port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            this.ip = ip;
            this.ex = new IPEndPoint(IPAddress.Parse(ip), port);
        }

        /// <summary>
        /// Socket 进行连接
        /// </summary>
        /// <returns>连接失败OR成功</returns>
        public bool Socketlink()
        {
            try
            {
                socket.Connect(ex);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Socket 发送消息
        /// </summary>
        /// <param name="strmsg">消息</param>
        public void SendVarMessage(string strmsg)
        {
            try
            {
                byte[] msg = System.Text.Encoding.UTF8.GetBytes(strmsg);
                this.socket.Send(msg);
            }
            catch (Exception ex)
            {
                this.socket.Close();
            }
        }

        /// <summary>
        /// Socket 消息回传
        /// </summary>
        /// <returns></returns>
        public string ReceiveMessage()
        {
            try
            {
                byte[] msg = new byte[1048576];
                int recv = socket.Receive(msg);
                this.socket.Close();
                return System.Text.Encoding.UTF8.GetString(msg, 0, recv);
            }
            catch (Exception ex)
            {
                this.socket.Close();
                return "ERROR";
            }
        }
    }
}

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

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            SocketHelper socket = new SocketHelper("10.0.0.217",20000);
            if(socket.Socketlink())
            {
                Console.WriteLine("连接成功");
                socket.SendVarMessage("ADDCACHE~张三");
                string strReposon = socket.ReceiveMessage();
                Console.WriteLine(strReposon);
            }
            Console.Read();
        }
    }
}

用途描述:

釜底抽薪网络被的数目好高速的传递

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

namespace SocketDome
{
    /// <summary>
    /// 处理Socket监听逻辑
    /// </summary>
    public class SocketProvider
    {
        private static Socket serviceSocketListener; //Socke监听处理请求

        /// <summary>
        /// 开启Socket监听
        /// </summary>
        public static void Init()
        {
            serviceSocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serviceSocketListener.Bind(new IPEndPoint(IPAddress.Parse("10.0.0.217"), 20000)); //IP和端口应该是可配置
            serviceSocketListener.Listen(1024);
            Thread handleSocket = new Thread(new ThreadStart(HandleSocket));
            handleSocket.Start();
        }

        /// <summary>
        /// 监听链接
        /// </summary>
        private static void HandleSocket()
        {
            while (true)
            {
                try
                {
                    Socket currSocket = serviceSocketListener.Accept();  //为新建连接创建新的 System.Net.Sockets.Socket
                    Thread processThread = new Thread(new ParameterizedThreadStart(ProcessSocket));
                    processThread.Start(currSocket);
                }
                catch { }
            }
        }

        /// <summary>
        /// 处理Socket信息
        /// </summary>
        /// <param name="obj">新建连接创建新Socket对象</param>
        private static void ProcessSocket(object obj)
        {
            Socket currSocket = (Socket)obj;
            try
            {
                byte[] recvBytess = new byte[1048576];
                int recbytes;
                recbytes = currSocket.Receive(recvBytess, recvBytess.Length, 0);
                if (recbytes > 0)
                {
                    var contentStr = Encoding.UTF8.GetString(recvBytess, 0, recbytes);
                    var _order = contentStr.Split('~');
                    byte[] sendPass = Encoding.UTF8.GetBytes(_order[0].ToUpper() + "#SUCCESS"); //先相应对话,然后去异步处理
                    currSocket.Send(sendPass, sendPass.Length, SocketFlags.None);
                    switch (_order[0].ToUpper())
                    { 
                        case"ADDCACHE":
                            Console.WriteLine("添加缓存消息" + _order[1]);
                           //处理ADDCACHE逻辑
                           Console.WriteLine("写Log日志");
                            break;
                        default :
                            Console.WriteLine("命令错误");
                            Console.WriteLine("写Log日志");
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("写Error日志" + ex.Message);
            }
        }
    }
}

波及描述:

HTTP协议是基于TCP的,由于HTTP请求是一致次呼吁一次答,由于要和回答都单生雷同浅,所以就算得保证数据的安全性,在及时同破的传递着不好丢失数据,所以HTTP是设基于更加安全之TCP协议如果不是UDP协商,Socket连接可以依据TCP也堪基于UDP,看具体的作业的需要了。HTTP请求使用基于TCP的Socket连接

TCP发送的包有序号,对方接到包后只要受一个报告,如果跨越一定时间还从未接举报就机关执行过重发,因此TCP最可怜的独到之处是十拿九稳。一般网页(http)、邮件(SMTP)、远程连接(Telnet)、文件(FTP)传送就用TCP

图片 2

TCP交互流程图

下看下客户端的Socket客户端主动请求服务端代码:

名词解释:

socket是针对性TCP或者UDP协议的卷入和兑现,socket并无是协商,差不多每一样种语言都实现了针对性TCP和UDP封装和促成之Socket代码库,方便开发程序员使用。

图片 3

(5)客户端接收响应数据报文

每当响应报文体里面才是我们客户端正真想使的物,对于Android/IOS移动端的话一般都是Json数据,对于web浏览器来说一般都是HTML,客户端取响应报文后就是处理数据。

其一服务端,监听着客户端发来的命,格式定义也:命令~参数,在服务端接受到客户端的下令消息继立刻回传接到指令并起拍卖,进行异步处理避免客户端等。

(2) 建立TCP连接

由于客户端发起,在三次等握手后客户端以及服务端建立TCP连接。所谓三不成握手(Three-way
Handshake),是恃建立一个TCP连接时,需要客户端与服务器总共发送3只包。
  三浅握手的目的是连续服务器指定端口,建立TCP连接,并联名连续双方的序列号和确认号并交换
TCP 窗口大小信息.在 Socket
编程中,客户端执行connect()时。将触发三不良握手。

  

图片 4

TCP三不行握手

   首先了解一下几个标志,SYN(synchronous),同步标志,ACK
(Acknowledgement),即承认标志,seq应该是Sequence
Number,序列号的意思,另外还有四次于握手的fin,应该是final,表示了标志。

第一软握手:客户端发送一个TCP的SYN标志位置1之包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence
Number)字段里。

仲不良握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位皆为1同时,将肯定序号(Acknowledgement
Number)设置为客户的行号加1以,即X+1。

老三不成握手:客户端再次发送确认包(ACK)
SYN标志位为0,ACK标志位为1。并且将服务器发来ACK的序号字段+1,放在规定字段中发送给对方.并且在数额段放写序列号的+1。

TCP通信的老三糟握手:三赖握手(Three-way
Handshake),是赖建立一个TCP连接时,需要客户端和服务器总共发送3个确保。

4、Socket

TCP/IP:Transmission Control Protocol/Internet
Protocol,传输控制协议/因特网互联协议,又称为网络通讯协议。简单来说:TCP控制传输数据,负责发现传输的问题,一旦出问题虽发出信号,要求再传输,直到有数据安全科学地传至目的地,而IP是负给因特网中之每一样高计算机定义一个地址,以便传输。TCP协议在诸多分布式应用程序中展开信息令传递是必要的部分。

2、TCP

TCP(Transmission Control
Protocol,传输控制协议)是OSI七层中传输层的商事。

第一为管理园身份被服务端查询,然后客户端主动请服务端进行信息请求。

用描述:

socket是针对性TCP或者UDP协议的包裹和贯彻,这样自己不怕好根据你所用语言的Socket来促成再次多的意义,有因Socket
TCP的HTTP请求,有根据Socket TCP长连接的信推送,也堪依据Socket
TCP/UDP自定义一仿照自己的通信协议。

  1. 第一糟握手:客户端发送一个TCP的SYN标志位置1之包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence
    Number)字段里。
  2. 亚糟糕握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位皆为1同时,将承认序号(Acknowledgement
    Number)设置为客户之I S N加1以.即X+1。
  3. 其三差握手:客户端再次发送确认包(ACK)
    SYN标志位为0,ACK标志位为1.并且将服务器发来ACK的序号字段+1,放在规定字段中发送给对方.并且于多少段放写ISN的+1

(1)域名解析

域名解析介意是客户端的做事,客户端只有服务端的域名(类似www.baidu.com),并不知道服务端的IP地址,需要客户端将在域名到DNS服务器获取域名对应之IP地址。

先看下服务端Socket监听代码:

磋商说:

TCP(Transmission Control
Protocol,传输控制协议)是因连接的商谈,也就是说,在正规收发数据前,必须和对方确立保险的连接。TCP提供过重发,丢弃重复数据,检验数据,流量控制等功效,保证数据能由同端传至任何一样端。
理想状态下,TCP连接要成立,在通信双方面临的任何一方主动关闭连接前,TCP
连接都用为一直维持下去。断开连接时服务器和客户端都好主动发起断开TCP连接的伸手

康宁体现于何处?
连天安全:三差握手
四次挥手,具体求参见:TCP详解。
数量安全:TCP提供过重发,丢弃重复数据,检验数据,流量控制等效果,保证数据能从同端传至其他一样端。

涉嫌描述:

HTTP基于TCP,HTTP请求需要采取Socket TCP来好。

5、一不善HTTP请求的心路历程

鉴于一次HTTP请求会干到HTTP TCP Socket DNS
等等,弄明白一次等HTTP的流程大概可以掌握网络要的原理。那么我们发送一次于HTTP请求到底要经历什么?
同样次HTTP请求和响应要更之几个步骤:

商量说:

HTTP 是基于
TCP/IP共商的应用层协议。它不干数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

有人说HTTP是一个冲TCP/IP通信协议来传递数据(HTML 文件, 图片文件,
查询结果等),我醒来这句话有题目,HTTP要是概念为谋那么http只是平栽规定规则,规定了客户端的URI请求格式和服务端数据应格式,要说HTTP请求是概念久比较含糊了,客户端发送一浅HTTP请求,经过OSI的七层协议的组装、传输、拆分、传输等有操作,最终可以获得我们想只要之数码。

涉描述:

OSI参考模型中传协议只有TCP和UDP两种,TCP需要链接安全效率低,UDP无线连接不安全效率高,我们平常用做多之HTTP协议基于TCP,很多言语都发出HTTP请求的包装,用起老方便,但是想利用UDP就没那么方便了,想用UDP我们就算用好失去描绘一个Socket
UDP了,Socket
UDP不欲链接,客户端知道服务端的IP和端口号直接发送数据就可以了,Socket
TCP由于需要链接所以使用的时刻要心跳机制来担保链接没有断开。

UDP一般用于多点通信和实时的数据业务,比如语音播发、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RTP(实时传送协议)RIP(路由于信息协议,如告诉股票市场,航空信息)、DNS(域名解释)。注重速度流畅。

图片 5

UDP交互流程图

(4)服务器端响应http请求

服务端收到客户端的HTTP请求将到要报文后就应请求,就是因请求报文处理后发送数据及客户端。服务端发送到客户端的数量称响应报文,由服务端组装,格式如下:

图片 6

HTTP响应报文

① 报文协议及本;
② 状态码及状态描述;
③ 响应报文头,也是由多独特性组成;
④ 响应报文体,即我们实在使之“干货”。

2、Http

HTTP(HyperText Transfer
Protocol、超文本传输协议)是OSI七层中应用层的磋商。

关系描述:

TPC/IP协议是招输层协议,主要解决数据
如何以网络中传,而HTTP是应用层协议,主要解决什么包装数据,而socket则是对准TCP/IP协议的包装和以(程序员层面上)。实际上http协议便是起家于tcp/ip协议之上的。,几乎每一样栽语言都发投机的Http实现,当然为闹和好之Socket实现,比如Golang、Java,在团结的net包里都得找到源代码。使用TCP协议是待连接三次于握手,断开连接三坏挥手的。

HTTP
是凭状态协议,它怪之前发生过的伸手和应的状态进行管理。也就是说,无法根据之前的状态进行此次的请处理。但是用Cookie和Session可以保存状态及识别。HTTP只能是由于客户端发起,服务端是无能为力主动想客户端发送数据的。

商讨说:

UDP用户数据报协议,是一个任连接的粗略的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数码报发送下,但是连无可知确保她能够抵目的地。由于UDP在传输数据报前不用在客户与服务器之间建立一个老是,且没有过重发等体制,故而传输速度很快。

3、UDP

UDP (User Datagram
Protocol,用户数量报协议)是OSI参考模型中管连接的传输层协议.

用途描述:

釜底抽薪客户端以及劳动端的多寡如何包装,包装两端最后得到的数据可以给识别。

(6)关闭TCP连接

诚如景象下TCP连接是由于客户端主动关闭的,关闭需要客户端主动发起四差挥手,才可关闭TCP连接。一般情况下,一旦请求与响应完成了,就假设关门TCP连接,然后使客户端还是服务器在其头信息在了这行代码:Connection:keep-alive,TCP连接于发送后拿还是保持开拓状态,于是,客户端可持续透过同样的接连发送请求。保持连续节省了吧每个请求建立新连所欲的时日,还节约了网络带来富。

TCP的连日的拆卸要发送四独确保,因此称为四次于挥手(four-way
handshake)。客户端或服务器都只是积极发起挥手动作,在socket

编程中,任何一方执行close()操作即可出挥手操作。

图片 7

TCP断开四浅挥手

骨子里有只问题,为什么老是的时光是三潮握手,关闭的时可是四不好挥手?

坐当Server端收到Client端的SYN连接要报文后,可以一直发送SYN+ACK报文。其中ACK报文是因此来回答的,SYN报文是故来
同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并无见面这关闭SOCKET,所以只能优先过来一个ACK报文,告诉Client端,”
你犯的FIN报文我收到了”。只有等交本人Server端所有的报文都发送完了,我才会发送FIN报文,因此不克一起发送。故待四步握手。 
   
 举例说明客户端主动发送TCP关闭请求步骤:

第一不行挥手:Client发送一个FIN,表示用关闭Client到Server的数量传送,Client进入FIN_WAIT_1状态
 
老二涂鸦挥手:Server收到FIN后,发送一个ACK给Client,确认序号为接到序号+1,Server进入CLOSE_WAIT状态

其三次于挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态

季次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为接收序号+1,Server进入CLOSED状态,完成四赖挥手

说到底图解一潮HTTP请求的心路历程:

图片 8

祈求解一不良HTTP请求的心路历程

参考文章:
HTTP、TCP、UDP、Socket
知识总结
面试复习——Android工程师的网基础
Android网络要心路历程

1、导读

记忆上大学时达到了《计算机网络基础》专门课,当时真是只善良无知,觉得自身然后还要非抓网络就无异于片的事物,没必要好好学习计算机网络及时等课程,只要考试通过就执行了。但是工作晚底本身发觉,不管是咱是不是召开软件开发,都见面多小少点接触到计算机网络,因为电脑网络无处不在。平时存受到我们要碰到路由器,交换机,dns,ping,修改dns等等这些骨干的操作,作为软件开发者,我们只要接触到tcp、udp、http、tcp连接三坏握手,断开四差挥手、socket等等这些专业点的知,真是这些专业点的知真是书到用时方恨少啊,接下我们虽完美无缺复习吧。

OSI凡Open System
Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该型定义了不同电脑互联的正规化,是计划性及描述计算机网络通信的骨干框架。OSI模型把网络通信的做事分为7层,分别是物理层多少链路层网络层传输层会话层表示层应用层

记忆方法:记住前的首先单字

物 数 网 传 会 表 应

立七叠每一样层还生温馨的意向,作用而下图分解:

图片 9

此地描绘图片描述

用描述:

化解网络被的数码可高枕无忧无错的传递

相关文章