【转自:https://www.cnblogs.com/IPrograming/archive/2012/10/15/CSharp_Socket_4.html】 

经过前面基础知识作为背景,现在对Socket编程进行进一步的学习。在 System.Net.Socket 命名空间提供了Socket类,利用该类我们可以直接编写Socket的客户端和服务的的程序。但是直接使用Socket类编写Socket程序会比较麻烦、而且容易出错,所以.NET为我们提供了进一步封装好的TcpListener类、TCPClient类和UdpClient类。同时,当我们希望通过网络传输数据时,首先应该将数据转换为数据流

1.Socket的类型

Socket的中文释义称为套接字,是支撑TCP/IP通信最基本的操作单元。可以将Socket看做不同主机之间的进程进行双向通信的端点,在一个双方都可以通信的Socket实例中,既保存了对方的IP地址和端口,也保持了双方通信采用的协议等信息。Socket有三种不同的类型:①.流套接字:实现面向连接的TCP通信

②.数据报套接字:实现无连接的UDP通信

③.原始套接字:实现IP数据包的通信(这里不做讨论)

 三种类型的套接字的对象均可使用Socket类来构造:

/// <summary>
        /// Socket 构造函数
        /// </summary>
        /// <param name="addressFamily">网络类型</param>
        /// <param name="socketType">Socket类型</param>
        /// <param name="protocolType">Socket使用的协议</param>
        public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType)

当我们编写基于TCP和UDP的应用程序时,既可以使用对套接字进行进一步封装的TcpListener类、TCPClient类和UdpClient类,也可以直接使用Socket类来实现,如果没有特殊需求应该使用进一步封装过的类,由于Socket类是他们实现的基础,所有在这里我们先从学习Socket类入手。

2.第一个Socket程序

 在无连接的两种协议。在面向连接的Socket中,使用TCP来建立两个地址端点的会话。一旦建立这种连接,就可以在设备之间进行可靠的数据传输。在进行跟深入的学习前我们先巩固一个简单的例子(TCP)来对Socket编程建立一个直观的印象。  

TCP Socket连接的过程可以简单的分为:①.服务端监听 ②.客户端请求 ③.建立连接在使用面向连接的Socket进行通信之前,两个应用程序之间首先要建立一个TCP连接,这涉及两台相互通信的主机的TCP部件间完成的握手消息(handshake message)的交换。下面我们通过直接使用Socket类来构建一个简单的Socket应用程序(这里先从同步Socket入手,实际项目要比这复杂,有许多需要考虑的问题:如消息边界问题、端口号是否冲突、消息命令的解析等等)。在这里我们为了和每一个客户端进行通信建立两个线程一个是接受客户端连接的线程,一个是接受客户端数据的线程,下面是分别是示例程序的服务端和客户端的代码:

2.1 服务器端代码:

【转】C# Socket编程(4)初识Socket和数据流
private static byte[] m_DataBuffer = new byte[1024];
        //设置端口号
        private static int m_Port = 8099;
        static Socket serverSocket;
        static void Main(string[] args)
        {
            //为了方便在本机上同时运行Client和server,使用回环地址为服务的监听地址
            IPAddress ip = IPAddress.Loopback;
            //实例化一个Socket对象,确定网络类型、Socket类型、协议类型
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //Socket对象绑定IP和端口号
            serverSocket.Bind(new IPEndPoint(ip, m_Port));
            //挂起连接队列的最大长度为15,启动监听
            serverSocket.Listen(15);

            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
            //一个客户端连接服务器时创建一个新的线程
            Thread myThread = new Thread(ListenClientConnect);
            myThread.Start();
        }

        /// <summary>
        /// 接收连接
        /// </summary>
        private static void ListenClientConnect()
        {
            while (true)
            {
                //运行到Accept()方法是会阻塞程序(同步Socket),
                //收到客户端请求创建一个新的Socket Client对象继续执行
                Socket clientSocket = serverSocket.Accept();
                clientSocket.Send(Encoding.UTF8.GetBytes("Server说:Client 你好!"));
                //创建一个接受客户端发送消息的线程
                Thread reciveThread = new Thread(ReciveMessage);
                reciveThread.Start(clientSocket);
            }
        }
          
        /// <summary>
        /// 接收信息
        /// </summary>
        /// <param name="clientSocket">包含客户端信息的套接字</param>
        private static void ReciveMessage(Object clientSocket)
        {
            if (clientSocket != null)
            {
                Socket m_ClientSocket = clientSocket as Socket;
                while (true)
                {
                    try
                    {
                        //通过clientSocket接收数据
                        int reciverNumber = m_ClientSocket.Receive(m_DataBuffer);
                        Console.WriteLine("接收客户端:{0}消息:{1}", m_ClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(m_DataBuffer, 0, reciverNumber));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        m_ClientSocket.Shutdown(SocketShutdown.Both);
                        m_ClientSocket.Close();
                        break;
                    }
                }
            }
        }
    }
View Code

相关文章:

  • 2021-11-17
  • 2021-11-12
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-17
  • 2021-12-26
  • 2021-11-19
  • 2022-12-23
  • 2021-07-06
相关资源
相似解决方案