zoukankan      html  css  js  c++  java
  • 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();
            }
        }
  • 相关阅读:
    从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)
    从壹开始前后端分离[.NetCore] 37 ║JWT实现权限与接口的动态分配——复杂策略授权
    从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
    从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto
    从壹开始微服务 [ DDD ] 之七 ║项目第一次实现 & CQRS初探
    CentOS7下的CDH 6.2.0 安装过程
    php获取客户端IP地址的方法
    IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
    Linux 系统 TCP优化
    Fedora 25-64位操作系统中安装配置Hyperledger Fabric过程
  • 原文地址:https://www.cnblogs.com/anjingdian/p/15322744.html
Copyright © 2011-2022 走看看