zoukankan      html  css  js  c++  java
  • C#网络Socket编程

    1.什么是Socket
    Sockets 是一种进程通信机制,是一个通信链的句柄(其实就是两个程序通信用的)

    2.分类

    • 流式套接字(SOCK_STREAM):提供了一种可靠的、面向连接的双向数据传输服务。实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看做无记录边界的字节流。在TCP/IP协议簇中,使用TCP实现字节流的传输,当用户要发送大批量数据,或对数据传输的可靠性有较高要求时使用流式套接字。
    • 数据报套接字(SOCK_DGRAM):提供了一种无连接、不可靠的双向数据传输服务。数据以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。在TCP/IP协议簇中,使用UDP实现数据报套接字。
    • 原始套接字(SOCK_RAW):该套接字允许对较低层协议(如IP或ICMP)进行直接访问。一般用于对TCP/IP核心协议的网络编程。

    3.相关概念
    端口:在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应用程序),因此,在网络协议中使用端口号识别主机上不同的进程。
    例如:http使用80端口,FTP使用21端口。
    协议:
    TCP是一种面向连接的、可靠的,基于字节流的传输层通信协议。为两台主机提供高可靠性的数据通信服务。它可以将源主机的数据无差错地传输到目标主机。当有数据要发送时,对应用进程送来的数据进行分片,以适合于在网络层中传输;当接收到网络层传来的分组时,它要对收到的分组进行确认,还要对丢失的分组设置超时重发等。为此TCP需要增加额外的许多开销,以便在数据传输过程中进行一些必要的控制,确保数据的可靠传输。因此,TCP传输的效率比较低。
    UDP是一种简单的、面向数据报的无连接的协议,提供的是不一定可靠的传输服务。所谓“无连接”是指在正式通信前不必与对方先建立连接,不管对方状态如何都直接发送过去。这与发手机短信非常相似,只要知道对方的手机号就可以了,不要考虑对方手机处于什么状态。UDP虽然不能保证数据传输的可靠性,但数据传输的效率较高。

    4.控制台简单例子

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    
    /// <summary>
    ///  服务器端
    /// </summary>
    namespace SocketServer
    {
        class Program
        {
            private static byte[] result = new byte[50];
            private static int myProt = 8885;//端口
            static Socket serverSocket;
    
            static void Main(string[] args)
            {
                IPAddress ip = IPAddress.Parse("127.0.0.1");//IP地址
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                serverSocket.Bind(new IPEndPoint(ip, myProt));//绑定IP地址端口
                serverSocket.Listen(10);//设定最多10个排队连接请求
                Console.WriteLine("启动监听{0}成功",serverSocket.LocalEndPoint.ToString());
                //通过Clientsoket发送数据
                Thread myThread = new Thread(ListenClientConnect);
                myThread.Start();
                Console.ReadLine();
            }
    
            /// <summary>
            ///  监听客户端连接
            /// </summary>
            private static void ListenClientConnect()
            {
                while (true)
                {
                    Socket clientSocket = serverSocket.Accept();
                    clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
                    Thread receiveThread = new Thread(ReceiveMessage);
                    receiveThread.Start(clientSocket);
    
                }
            }
    
            /// <summary>
            ///  接收消息
            /// </summary>
            /// <param name="clientSocket"></param>
            private static void ReceiveMessage(object clientSocket)
            {
                Socket myClientSocket = (Socket)clientSocket;
    
                while (true)
                {
    
                    try
                    {
                        int receiveNumber = myClientSocket.Receive(result);
                        if (receiveNumber == 0)
                        {
                            break;
                        }
                        Console.WriteLine("接受客户端{0}的消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        throw;
                    }
    
                }
                myClientSocket.Shutdown(SocketShutdown.Both);
                myClientSocket.Close();
            }
    
        }
    }
    
    
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    /// <summary>
    ///  客户端
    /// </summary>
    namespace SocketClient
    {
        class Program
        {
            private static byte[] result = new byte[1024];
            static void Main(string[] args)
            {
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                try
                {
                    clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口  
                    Console.WriteLine("连接服务器成功");
                }
                catch
                {
                    Console.WriteLine("连接服务器失败,请按任意键退出!");
                    Console.Read();
                    return;
                }
    
                //通过clientSocket接收数据  
                int receiveLength = clientSocket.Receive(result);
                Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
                try
                {
                    string sendMessage = "client send Message Hello @ " + DateTime.Now;
                    clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
                    Console.WriteLine("向服务器发送消息:{0}",sendMessage);
                }
                finally
                {
                    clientSocket.Shutdown(SocketShutdown.Both);
                    clientSocket.Close();
                }
                Console.WriteLine("发送完毕,按回车键退出");
                Console.ReadLine();
            }
        }
    }
    
    

    运行之后的效果是:

  • 相关阅读:
    Web架构中的前端页面缓存
    Drools 使用Spring中的bean
    大型Java多用户商城系统设计开发的心得和困难
    正则表达式
    No ideal,no future
    关于sql 2005 assembly
    修改aspx输出的action地址 
    关于[META HTTPEQUIV="REFRESH" CONTENT=2]
    最简单的兼容firefox和ie的锚点方法
    【IIS】检索COM类工厂中CLSID为{0002450000000000C000000000000046}的组件时失败,错误: 80070005
  • 原文地址:https://www.cnblogs.com/ButterflyEffect/p/10238760.html
Copyright © 2011-2022 走看看