
 
 
        Socket(套接字、插口)
        TCP和UCP的区别:
         1、基于连接和无连接
         2、对系统资源的要求(TCP较多,UCP少)
         3、UDP程序结构简单
         4、流模式和数据报模式
         5、TCP保证数据正确性和数据先后顺序,UDP可能丢包,且不保证数据到达先后顺序 
// 进行前先寻得本机IPv4地址
win + R ——>cmd——>输入ipconfig


 
 
// TCP类
    class TCP
    {
        // 服务器端套接字(指定的寻址方案的一个实例.IPv4,套接字类型.字节流,支持的协议.TCP)
        Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        // 客户端套接字
        Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        
        //Internet 协议 (IP) 地址(IP 地址的字节数组值)
        IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });
        
        public void TcpServer()
        {
            //IP + Port(端口) 地址和端口号,端口号由自己指定,用于链接
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);
            tcpServer.Bind(ipEndPoint);  /*将相关联 tcpServer 与本地终结点*/
            // 侦听tcpServer(挂起的连接队列的最大长度)
            tcpServer.Listen(20);
            Console.WriteLine("正在连接客户端……");
            
            // 新创建的连接
            Socket client = tcpServer.Accept();
            Console.WriteLine("一个客户端链接过来了");
            // 接收信息
            byte[] data = new byte[1024];
            // 将tcpServer数据的按字节存入接收缓冲区(接收到的数据的存储位置)
            int length = client.Receive(data);
            //字符编码.获取 UTF-8 格式的编码.将指定字节数组中的一个字节序列解码为一个字符串(包含要解码的字节序列的字节数组,第一个要解码的字节的索引,要解码的字节数)
            string message = Encoding.UTF8.GetString(data, 0, length);
            Console.WriteLine("接收到客户端的消息:" + message);
            // 发送消息,将指定字符串中的所有字符编码为一个字节序列
            client.Send(Encoding.UTF8.GetBytes("欢迎你的到来"));
            // 关闭Socket连接和释放所有关联资源
            client.Close();
            tcpServer.Close();
        }
        public void TcpClient()
        {
            //IP + Port(端口),与客户端一致,保证接收
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);
            //建立与远程主机的连接(远程设备)
            tcpClient.Connect(ipEndPoint);
            
            Console.WriteLine("链接上了服务器端!");
            string message = "我上线了";
            tcpClient.Send(Encoding.UTF8.GetBytes(message));
            byte[] data = new byte[1024];
            int length = tcpClient.Receive(data);
            Console.WriteLine("接收到服务器的信号:" + Encoding.UTF8.GetString(data));
            
            tcpClient.Close();
        }
    }// UDP类
    class UDP
    {
        Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });
        public void UdpSer()
        {
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);
            // udpServer连接节点ipEndPint
            udpServer.Bind(ipEndPoint);
            // 提供了一个指示服务器必须侦听的所有网络接口上的客户端活动的 IP 地址
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
            // 标识网络地址,abstrct类
            EndPoint ep = ipep;
            byte[] data = new byte[1024];
            // 接收到数据缓冲区,将存储终结点(数据的存储位置,引用传递(远程服务器))
            int length = udpServer.ReceiveFrom(data, ref ep);
            
            Console.WriteLine("接收到来着UDP客户端的数据:" + Encoding.UTF8.GetString(data, 0, length));
            
            udpServer.Close();
        }
        public void UdpCnt()
        {
            byte[] data = Encoding.UTF8.GetBytes("你好,udp客户端上线了");
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);
            udpClient.SendTo(data, ipEndPoint);
            udpClient.Close();
        }
    }// 主程
        static void Main(string[] args)
        {
            // TCP
            TCP server = new TCP();
            Thread sr = new Thread(server.TcpServer);
            Thread ct = new Thread(server.TcpClient);
            sr.Start();
            ct.Start();
            Thread.Sleep(1000);
            sr.Abort();
            ct.Abort();
            // UDP
            UDP udp = new UDP();
            Thread sUdp = new Thread(udp.UdpSer);
            Thread cUdp = new Thread(udp.UdpCnt);
            sUdp.Start();
            cUdp.Start();
            Thread.Sleep(1000);
            cUdp.Abort();
            sUdp.Abort();
        }// 结果
正在连接客户端……
链接上了服务器端!
一个客户端链接过来了
接收到客户端的消息:我上线了
接收到服务器的信号:欢迎你的到来  
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
接收到来着UDP客户端的数据:你好,udp客户端上线了
请按任意键继续. . .








![[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?](https://img-blog.csdnimg.cn/26009fcef45c4eda8540f56f243ec6ed.png)









