.Net学习笔记----2015-07-06(Socket概念)

Socket的英文原意:“孔”或“插座”

  作为进程通信机制,取后一个意思。通常也叫“套接字”,用于描述IP地址和端口号,是一个通信链的句柄。(就是俩程序通信用的)

Socket非常类似于电话插座

  以一个电话网为例。电话的通话双方相当于互通信息的2个程序,电话号码就是IP地址。任何用户在通话前,首先要占有一部电话机,相当于申请一个Socket;

  同时,要知道对方的号码,相当于对方有一个固定的Socket。

  然后向对方拨号呼叫,相当于发出连接请求。

  对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,就是一方向电话机发出信号和对方从电话机接收信号的过程,

  相当于向Socket发送数据和从Socket接收数据。

  通话结束后,一方挂起电话机,相当于关闭Socket,撤销连接。

 

.Net学习笔记----2015-07-06(Socket概念)_第1张图片

  1)、服务端Welcome Socket 开始监听端口(负责监听客户端连接信息)

  2)、客户端client Socket连接服务端指定端口(负责接收和发送服务端消息)

  3)、服务端Welcome Socket 监听到客户端连接,创建correction socket。(负责和客户端通信)

 

在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应用程序)

例如:http使用80端口,ftp使用21端口 smtp使用25端口

两种类型:50000

  流式Socket(STREAM):

  一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但效率低

  数据报式Socket(DATAGRAM):

  一种无连接的Socket,对应于无连接的UDP服务应用,不安全(丢失数据,顺序混乱,在接收端要分析重排及要求重发),但效率高。

 

Socket通信基本流程图

.Net学习笔记----2015-07-06(Socket概念)_第2张图片

示例:

        public Form1()
        {
            InitializeComponent();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            //当点击开始监听时,在服务器端创建一个负责监听IP地址和端口号的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Any;
            //创建端口号对象
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
            //监听
            socketWatch.Bind(point);
            ShowMsg("监听成功");
            socketWatch.Listen(10);

            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);
            
            
        }
        /// <summary>
        /// 循环等待客户端的连接 并且创建与之通信用的Socket
        /// </summary>
        void Listen(object o)
        {
            Socket socketWatch = o as Socket;
            //等待客户端的连接 并且创建一个负责通信的Socket
            while (true)
            {
                Socket socketSend = socketWatch.Accept();
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
            }
        }
        /// <summary>
        /// 追加文本,日志列表,用追加可以观察客户端发来的消息
        /// </summary>
        /// <param name="str"></param>
        void ShowMsg(string str)
        {
            txtLog.AppendText(str + "\r\n");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }

 

你可能感兴趣的:(socket)