Socket基础二

1:什么是Socket?
Socket又被称之为"套接字",是计算机之间通信的一种约定或者方式,通过这种约定,计算机之间可以相互发送数据。
2:本质是什么?
实际上是对TCP/IP协议的封装,它的出现方便了程序员使用TCP/IP协议栈,本身不是协议。可以看做是传输层和应用层之间抽象出来的一层,是一组调用接口(TCP/IP网络的API函数) 

 

 

3 步骤

服务器端程序编写的程序步骤:

第一:首先肯定是要先创建一个Socket套接字。
第二:客户端想要连接到服务器上,必须要知道IP地址和端口号,根据端口号才能找到服务器上具体是哪个应用程序。使用Bind()方法来绑定IP和端口号(服务器端的端口号就是服务器端的应用程序所使用的的端口号,和客户端没关系)。一定要注意将服务器端的IP和端口进行绑定,否则客户端根据IP和端口申请连接的时候会失败。
第三:准备工作做好之后就要开始监听,看看有哪些客户端设备来连接服务器,通过Listen方法建立一个监听序列,存在待处理的客户连接。这个地方一定要搞清楚一件事,就是在监听的时候必须设置一个时间点内最多能连接的数量,比如类似游戏登录的时候同一时间那么多设备请求,不可能同时对所有的请求都进行回应,必须设置一个回应请求的最大上限,超过这个数量就排队进行等待。比如网吧中有10台电脑最多容纳10个人连接网络玩游戏,但是这个网吧并不是只能容纳10个人,超过10个人之后需要你站在旁边等着,有人用完之后你才能用。
第四:监听工作准备好之后就要开始处理监听序列中的客户连接信息了,通过accept方法实现。
第五:建立连接之后,通过receive和send来进行接收发送信息。
第六:关闭连接
代码:

/// <summary>
    /// 简单Socket服务端
    /// </summary>
    public class SimpleSocketServer
    {
        public static void Proccess()
        {
            int port = 2018;
            string host = "127.0.0.1";

            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);

            Socket sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sSocket.Bind(ipe);
            sSocket.Listen(0);
            Console.WriteLine("监听已经打开,请等待");

            //收到消息  接受一个socket链接
            Socket serverSocket = sSocket.Accept();
            Console.WriteLine("连接已经建立。。。");
            while (true)
            {
                string recStr = "";
                byte[] recByte = new byte[4096];
                int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
                recStr += Encoding.ASCII.GetString(recByte, 0, bytes);
                Console.WriteLine("服务器端获得信息:{0}", recStr);

                if (recStr.Equals("stop"))
                {
                    serverSocket.Close();//关闭该socket对象
                    Console.WriteLine("关闭链接。。。。");
                    break;
                }

                //回发消息
                Console.WriteLine("请输入回发消息。。。。");
                string sendStr = Console.ReadLine(); //"send to client :hello world";
                byte[] sendByte = Encoding.ASCII.GetBytes(sendStr);
                serverSocket.Send(sendByte, sendByte.Length, 0);

            }
            sSocket.Close();//关闭server监听
        }
    }

客户端步骤:

第一:也是要创建Socket套接字,这是最基础的准备工作。
第二:此时客户端需要主动申请服务器的连接,通过connect方法实现,一定要写对服务器的IP和端口号。
第三:申请成功之后,通过receive和send来进行通信。
第四:close()关闭连接。

代码实现:

/// <summary>
    /// 发起socket请求
    /// 常使用的其实是Http请求; 单向,客户端===服务器   请求响应式;
    /// socket==套接字,长链接、双工通信,可以让客户单和服务器之间相互发送消息;
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("启动一个Socket客户端链接"); 
                int port = 2018;
                string host = "127.0.0.1";//服务器端ip地址 
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                //注意这里: ProtocolType.Tcp表明是TCP连接,可以改成UDP连接: ProtocolType.Udp
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(ipe); //开启链接以后,是长链接; 因为没有关闭,close方法在while(true)方法体之外, 一直保持连接,
                while (true)
                {
                    Console.WriteLine("请输入发送到服务器的信息:");
                    string sendStr = Console.ReadLine();
                    if (sendStr == "exit")
                        break;

                    byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
                    clientSocket.Send(sendBytes);

                    //receive message
                    string recStr = "";
                    byte[] recBytes = new byte[4096];
                    //监控传递过来的消息;
                    int bytes = clientSocket.Receive(recBytes, recBytes.Length, 0);
                    recStr += Encoding.ASCII.GetString(recBytes, 0, bytes);
                    Console.WriteLine($"服务器返回:{recStr}");
                }
                clientSocket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章